【问题标题】:Skip over a set of values (in an array) in a loop - Python3在循环中跳过一组值(在数组中) - Python3
【发布时间】:2019-02-03 10:58:47
【问题描述】:

我有一个循环读取数据,但编号不连续。因此,我想跳过特定的值。但我只知道如何跳过一个,而不是一组值。 这是我的示例代码:

for n in [x for x in range(2,m) if x!=9]:
    if n < 10:
        stationsnr = '00'+np.str(n)
    elif n < 100:
        stationsnr = '0'+np.str(n)
    else:
        stationsnr = np.str(n)

但我需要的不是“x!= 9”,而是 if x!= 其中一个值 [9,10,12,16,......] (编辑:这些值存储在列表中)。有什么建议吗?

【问题讨论】:

  • 这些值是否在列表中?
  • 大概for循环中的列表理解只是一个例子?我不会在那里使用列表理解,因为它首先会创建一个完整的列表;至少使用生成器表达式:for n in (x for x in range(2, m) if x != 9):
  • @ThatBird 那是我的计划。
  • 你使用np.str而不是直接调用str构造函数有什么原因吗?顺便说一句,您可以在不使用if...elif...else 的情况下进行填充。请参阅str.zfillstr.rjust

标签: python python-3.x loops for-loop


【解决方案1】:

您可以测试该值是否是集合的成员:

[... if x not in {9, 10, 12, 16, }]

设置成员资格测试是 O(1) 恒定时间(所以!)。

【讨论】:

    【解决方案2】:

    您可以在 for 循环中使用 enumerate() 函数。它像正常一样返回列表的元素,但也返回索引位置。例如:

    indices_to_avoid = [1,4,6]  # indices to skip over
    for item, idx in enumerate(range(2, m)):
        if idx not in indices_to_avoid:
            do_something()
    

    就像上面的答案所说,您也可以使用列表推导,但如果您的排除列表很长,列表推导可能会变得很长。我认为冗长的列表推导难以阅读,并且比简单的 for 循环更容易混淆,尤其是当列表组合进入下一行时。

    【讨论】:

      【解决方案3】:

      你可以使用 -

      if x is not in [your list]
      

      但是使用set 比使用列表更好,因为在集合上的查找时间是 O(1),这是恒定的,因为它们是散列的。

      所以你的代码可以变成 -

      if x is not in (your set)
      

      另外,list 的追加时间是 O(N),而 set 的追加时间是 O(1),因此插入到集合中也会更快(并且也可以从中删除)

      【讨论】:

        猜你喜欢
        • 2018-07-21
        • 1970-01-01
        • 2015-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-21
        • 2010-09-27
        相关资源
        最近更新 更多