【问题标题】:Print all even numbers in a list until a given number打印列表中的所有偶数,直到给定数字
【发布时间】:2013-01-26 12:47:40
【问题描述】:

我刚刚开始涉足 Python,并且已经开始阅读 learnpython.org 上的章节。在“循环”一章中,我用下面的代码解决了这个挑战。但是我不确定它是最有效的。这似乎不是因为我必须两次定义“不超过的数字”。在这个(我猜的)简单的问题中,DRY 应该是可以坚持的,对吧?

exercise

循环并打印出数字列表中的所有偶数 他们收到的订单相同。不要打印任何数字 在序列中的 237 之后。

我的代码:

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, 399, 162, 758, 219, 918, 237, 412, 566, 826, 248, 866, 950, 626, 949, 687, 217, 815, 67, 104, 58, 512, 24, 892, 894, 767, 553, 81, 379, 843, 831, 445, 742, 717, 958, 609, 842, 451, 688, 753, 854, 685, 93, 857, 440, 380, 126, 721, 328, 753, 470, 743, 527 ]

# My Solution
for x in numbers:
  if x != 237:
    if x % 2 == 0:
      print x
  if x == 237:
    break

【问题讨论】:

    标签: python


    【解决方案1】:

    这就是elseelif 的用途:

    for x in numbers:
      if x == 237:
        break
      elif x % 2 == 0:
        print x
    

    【讨论】:

    • 这是一个可悲的速度改进,但在相等之前测试均匀性可能会更快,因为一个数字更可能是偶数而不是等于 237 而 237 不是偶数。
    • 嗯,这很有意义......不太清楚我为什么要去把事情复杂化...... :) Thx
    • 实际上,在您的示例中, else 和 elif 都不是必需的。第 4 行可能只是 if x%2==0
    【解决方案2】:

    另一种方法是使用itertools,它总是以某种方式有用:

    >>> from itertools import takewhile, ifilter
    >>> not_237 = takewhile(lambda L: L != 237, numbers)
    >>> is_even = ifilter(lambda L: L % 2 == 0, not_237)
    >>> list(is_even)
    [402, 984, 360, 408, 980, 544, 390, 984, 592, 236, 942, 386, 462, 418, 344, 236, 566, 978, 328, 162, 758, 918]
    

    所以我们创建了一个在 237 处停止的惰性迭代器,然后从该偶数中取出

    【讨论】:

    • 我确信这真的很简洁,但是您是否阅读过关于“简单示例”的部分? :)
    • @PatrikAlienus 好吧 - 我认为它比循环更简单、更清晰 :)
    • 好吧,我想这是对集体知识的补充,但我不理解超过 10% :)
    【解决方案3】:

    这也是可能的:

    try:
        i = numbers.index(237)
    except:
        i = len(numbers)
    for n in numbers[:i]:
        if not n%2:
           print n
    

    【讨论】:

    • 是的,但是你必须处理一个异常。
    • @thg435,感谢您提醒我这个问题 - 我已经修复了它 - 但它看起来很糟糕并且有严重的性能缺陷 - 我最好删除这个答案;)
    • 我认为这个表格的答案很有帮助。
    • 这至少对我有帮助。我开始看到确实有很多方法可以实现相同的目标。问题是,如何通过一个基准来判断哪个是最有效的?人类可读性通常不是一个很好的衡量标准:)
    【解决方案4】:

    我只是在我的“学习基础知识”中完成这个练习,我得出了一个类似但更糟糕的解决方案,patrik :(

    x = 0 for loop in numbers: if (numbers[x]) % 2 ==0: print (numbers[x]) x = x+1
    if (numbers[x]) ==237: break
    else: x =x+1 continue

    【讨论】:

    • 提问者正在寻求一种更有效的方法来解决问题。你说你的解决方案“有点糟糕”。我可以建议您使用更有效的代码更新您的答案或完全删除此答案。
    【解决方案5】:

    你可以使用列表推导来做到这一点

    解决方案是这样的:

    numbers = [x for ind,x in enumerate(numbers) if x % 2== 0 and numbers[ind+1]!=237 ]
    

    【讨论】:

      【解决方案6】:

      3 if's and done :)

          if x % 2 == 0:
              print x
          if x == 237:
              break
          if x % 2 != 0: 
              continue
      

      输出

      402
      984
      360
      408
      980
      544
      390
      984
      592
      236
      942
      386
      462
      418
      344
      236
      566
      978
      328
      162
      758
      918
      

      【讨论】:

        猜你喜欢
        • 2020-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多