【问题标题】:Python Loop While Until Condition Is MetPython循环直到条件满足
【发布时间】:2021-12-24 10:30:53
【问题描述】:

我正在尝试创建一个 while 或 if 循环来按顺序单步执行一个列表,以返回在值更改之前所需的步数。这是我的清单示例。对于第一个项目(通过 47),循环将输出 1。对于第一个 39,循环将输出 3,对于第二个 39,它将输出 2,对于第三个它将输出 1。然后对于前 31 个会放 5 个,接下来的 31 个会放 4 个,以此类推。

我不确定如何执行此操作,以及是否可以使用 while 循环来完成。我认为可以使用从 1 开始的迭代器/计数器来完成,然后逐步增加 (+= 1) 直到值发生变化。我认为这将是一个'while list[orig index] == list[orig + iterator index],迭代计数器并测试是否相等。也就是说,我不知道 while 循环如何使用新的“迭代器”值再次评估原始真实条件。

我尝试了类似的方法,它似乎有效,但绝对笨重......关于如何简化的任何想法。它也不考虑嵌套“ifs”数量以上的计数

for i in range(0, len(df)):
    diff = 1
    if df.iloc[i + diff - 1]['prev_count'] != '3--2':
        gap.append(diff)
    else:
        diff += 1
        if df.iloc[i + diff - 1]['prev_count'] != '3--2':
            gap.append(diff)
        else:
            diff += 1
            if df.iloc[i + diff - 1]['prev_count'] != '3--2':
                gap.append(diff)
            else:
                diff += 1
                if df.iloc[i + diff - 1]['prev_count'] != '3--2':
                    gap.append(diff)
                else:
                    diff += 1
                    gap.append(diff)

list1 = [[81, 79, 74, 57, 47, 39, 39, 39, 31, 31, 31, 31, 31, 30, 27, 22, 20,

【问题讨论】:

  • Stackoverflow 不会为您编写代码。到目前为止,您尝试过什么?
  • 欢迎来到 Stack Overflow!请使用tour 并阅读How to Ask。你已经尝试过什么,你到底卡在哪里?如果您不确定如何开始,请先尝试在纸上写下说明。另外,请写一个正确的标题。 How to Ask 有这方面的提示。
  • 我可能会编写一个生成器函数,但您应该继续在问题中发布您的实现。
  • 感谢您的反馈,我尝试添加更多细节。尽管它仅限于我编写的 IF 语句的数量,但我使用嵌套 IF 的非常手动的方法来实现这一点。我想知道是否有一种方法可以使用 while,或者迭代相同的 If 步骤直到条件满足。干杯并感谢您的所有帮助(以及对问题的耐心 - 编码和 Stack Overflow 的新手!)

标签: python list loops for-loop while-loop


【解决方案1】:

您可以使用 numpy 数组来迭代条件。例如:

#Array to check
x = np.array([81, 79, 74, 57, 47, 39, 39, 39, 31, 31, 31, 31, 31, 30, 27, 22, 20])
#Counts
y = np.ones(x.shape)

#Loop for each gap, check for equality, and add to y
for i in range(1, x.shape[0]):
    y[:-i] = np.where(x[:-i]==x[i:], y[:-i]+1, y[:-i])
print(y)

应该产生:

>>> [1. 1. 1. 1. 1. 3. 2. 1. 5. 4. 3. 2. 1. 1. 1. 1. 1.]

还有很多其他方法可以做到这一点,因此您也可以探索其他选项。

【讨论】:

  • 在使用numpy 时使用循环真的很糟糕。如果可以的话,尝试用某种numpy 方法替换它们
  • @mathfux 我可以考虑使用列表理解和np.sum 来避免for-loop,但是代码对于初学者来说太抽象且难以理解。
  • 就性能而言,列表理解和 for 循环都是等价的。用一些numpy 方法替换它们是个好主意。但是,为每个项目使用np.where 是多余的。不要尝试在包含单个重复项的大型列表上运行它。
  • 假设 np.where 的复杂度为 O(n),那么我编写的代码将为 O(n**2)。我知道这不是完成这项任务的最佳方式,但我知道这是最简单的方式。
  • 这可以用while循环来完成吗?
猜你喜欢
  • 2018-06-29
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 2016-04-12
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多