【问题标题】:Python (loops) with a list带有列表的 Python(循环)
【发布时间】:2013-07-18 17:16:09
【问题描述】:

我正在学习 Python,并在 for 循环的条件下苦苦挣扎。我一定错过了一些简单的东西。我有一个包含一些 int 值的列表,我想 (1) 打印所有偶数和 (2) 只打印不超过某个索引的值。我可以很好地打印偶数,但似乎不能只打印到某个索引。

numbers = [951, 402, 984, 651, 360, 69, 408, 319, 601, 485, 980, 507, 725, 547, 544, 615, 83, 165, 141, 501, 263, 617, 865, 575, 219, 390, 984, 592, 236, 105, 942, 941, 386, 462, 47, 418, 907, 344, 236, 375, 823, 566, 597, 978, 328, 615, 953, 345]
  1. 打印列表中的所有数字 -- ok:

    for i in numbers:
        print i
    
  2. 打印列表中的所有偶数 -- ok:

    for i in numbers:
        if i % 2 == 0:
            print i
    

假设我只想打印直到并包括值为 980 的条目的偶数 - 所以这将是 402、984、360、408、980。

我尝试实现计数和while 循环以及打印numbers[n] < numbers.index(980) 的条件,但未成功。

【问题讨论】:

  • .index(...) 几乎是无关紧要的恕我直言;这并不是说它没有用,但我几乎从来不需要使用它。它的作用是查找第一次出现的数字,也就是说,index(980) 将查找数字 980 第一次出现在列表中的索引。
  • 你好,你的第二个循环不会工作,因为 x 没有定义。你的意思可能是for x in numbers: if x%2==0: print x

标签: python list loops


【解决方案1】:

使用enumerate() function 包含循环索引:

for i, num in enumerate(numbers):
    if num % 2 == 0 and i < 10:
        print num

或者,只需对列表进行切片以仅考虑第一个 n 元素,尽管这会创建子列表的新副本:

for num in numbers[:10]:
    if num % 2 == 0:
        print num

如果您需要测试num 的特定值,您也可以使用break 提前退出for 循环:

for i, num in enumerate(numbers):
    if num % 2 == 0:
        print num
    if num == 980 or i >= 10:
        break  # exits the loop early

【讨论】:

  • 感谢您的快速回复,让我更准确地说,如果我不知道索引的位置怎么办,我想说只打印直到并包括索引 980 的偶数值而不是位置 [:10]?
  • @bburn312:不完全确定你在问什么。 i &lt; 980 测试最高为 980 的索引,您也可以添加 and i != 10 以跳过该索引。
  • @bburn312:如果你的意思是num == 980,那么就测试一下,然后用break 退出。
  • 可能与效率无关的次要问题:这会不间断地遍历整个列表。
【解决方案2】:

两种可能:

第一个使用enumerate,将a, b, c...变成(0,a) (1,b) (2,c) ...

for i,n in enumerate(numbers):
    if i==last_index:
        break
    print n

第二种可能性使用切片,它创建另一个列表,表示原始列表的一部分:

for n in numbers[:last_index]:
    print n

第二种方法不如第一种有效,因为它会复制列表的切片(除非您正在切片 range(...) 或其他“智能”对象,在这种情况下,它可能会返回“虚拟列表” ')。但是,可以考虑阅读得更干净,这样可能是可以接受的,除非您关心的部分很小或者您不关心内存或空间效率。

【讨论】:

    【解决方案3】:

    有一个break 语句离开当前循环:

    >>> for i in numbers:
    ...     if i % 2 == 0:
    ...         print i
    ...     if i == 980:
    ...         break
    ... 
    402
    984
    360
    408
    980
    

    【讨论】:

    • 就是这样!非常感谢zch。
    • @zch 您也应该教授适当的变量命名:例如number 而不是 i (for number in numbers...)
    【解决方案4】:

    要操作列表,请查看list comprehensions。特别是对于大型列表,它们比 for 循环快得多。

    根据您的 numbers 列表,您可以像这样隔离偶数:

    In [3]: even = [n for n in numbers if n % 2 == 0]
    
    In [4]: even
    Out[4]: [402, 984, 360, 408, 980, 544, 390, 984, 592, 236, 942, 386, 462, 418, 344, 236, 566, 978, 328]
    

    在这种情况下你可以这样做:

    for i in even:
        print i
    

    第二个问题:

    In [7]: selection = [n for i, n in enumerate(numbers) if n % 2 == 0 and i < numbers.index(980)]
    
    In [8]: selection
    Out[8]: [402, 984, 360, 408]
    

    所以你可以这样做

    for n in selection:
        print n
    

    顺便说一句,InOut 来自 IPython,这是一个很棒的交互式 Python 环境。

    【讨论】:

      【解决方案5】:

      itertools是一个有很多精彩功能的模块:

      from itertools import takewhile
      
      numbers = [951, 402, 984, 651, 360, 69, 408, 319, 601, 485, 980, 507, 725, 547, 544, 615, 83, 165, 141, 501, 263, 617, 865, 575, 219, 390, 984, 592, 236, 105, 942, 941, 386, 462, 47, 418, 907, 344, 236, 375, 823, 566, 597, 978, 328, 615, 953, 345]
      
      for number in (number for number in takewhile(lambda x: x != 980, numbers) if number % 2 == 0):
          print(number)
      

      添加更多的itertools函数:

      from itertools import ifilterfalse, takewhile
      for number in ifilterfalse(lambda x: x % 2, takewhile(lambda x: x != 980, numbers)):
          print(number)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-26
        • 2021-04-19
        • 1970-01-01
        • 2017-02-25
        相关资源
        最近更新 更多