【问题标题】:Generating a list of EVEN numbers in Python在 Python 中生成偶数列表
【发布时间】:2012-06-27 19:09:53
【问题描述】:

基本上我需要帮助来从我用 Python 创建的列表中生成偶数:

[1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, ...]

我尝试了几种不同的方法,但每次打印时,都会有奇数和偶数混合在一起!

如果我要在 0-100 的范围内计算,我知道如何生成偶数/奇数,但是,仅从前面提到的列表中获取偶数让我很难过!

附:我才用python几天,如果结果非常简单,提前谢谢!

编辑:感谢所有回复,在您的帮助下,我已经解决了这个小问题。 这是我最后完成的一个小练习,要求对斐波那契数列的偶数求和:

F = [1, 2]
while F[-1] < 4000000
    F.append(F[-1] + F[-2])

sum(F[1::3])
4613732

【问题讨论】:

  • 仅在目标列表中包含可被 2 整除的数字。
  • 您尝试了哪些不同的方法?
  • 有点奇怪,您在过滤列表之前设法生成了斐波那契数列... ;)

标签: python numbers fibonacci


【解决方案1】:
a = range(0,1000)
b = []
for c in a:
    if c%2==0:
        b.append(c)
print b

【讨论】:

  • 如果您能提供一些有关此功能的信息,那就太好了。此外,您可以使用range 的第三个step 参数来节省大量代码。
【解决方案2】:

您可以使用a list comprehension

evens = [n for n in numbers if n % 2 == 0]

您也可以使用the filter function

evens = filter(lambda x: x % 2 == 0,numbers)

如果列表很长,可能需要创建一些东西来迭代列表,而不是使用ifilter from itertools 创建其中一半的副本:

from itertools import ifilter
evens = ifilter(lambda x: x % 2 == 0,numbers)

或者使用generator expression:

evens = (n for n in numbers if n % 2 == 0)

【讨论】:

  • OP,这是一个很好的答案,但考虑到 lambda 对于 python 的第一天来说有点太先进了:)
  • 呃,ifilter?只需 (x for x in numbers if not x % 2) 即可。
  • 添加了一个生成器表达式,虽然我选择了n % 2 == 0
【解决方案3】:

以下示例应该可以解决您的问题。

Newlist = []
for x in numList:
   if x % 2 == 0:
      print x          
      Newlist.append(x)

【讨论】:

  • 如果您想打印所有偶数 - 如果您想获得可以使用的列表,请参阅下面的答案。编辑:我看到新版本将它附加到一个新列表:)
【解决方案4】:

使用列表推导(参见:Searching a list of objects in Python

myList = [<your list>]
evensList = [x for x in myList if x % 2 == 0]

这很好,因为它使列表保持不变,并且您可以将 evensList 用作普通列表对象。

希望这会有所帮助!

【讨论】:

  • 我认为列表理解在使用 python 的第一天可能有点先进......但这只是我的意见!
  • @Trufa 列表推导是关于 python 最好的部分之一......为什么不早点介绍它们呢?
  • 哦,我同意,但这是最好的做法——它给他留下了一个列表对象。
  • 我只是认为在进入列表理解之前学习 for 循环的输入和输出会更健康。但是,恕我直言。
  • 为了更简洁的代码,您可以简单地使用if not x%2 而不是if x % 2 == 0
【解决方案5】:

检查一下

A = [i for i in range(101)]
B = [x for x in A if x%2 == 0]
print B

【讨论】:

    【解决方案6】:

    在您的具体情况下,my_list[1::3] 将起作用。斐波那契的偶数之间总有两个奇数:偶数、奇数、奇数、偶数、奇数、奇数......

    >>> my_list = [1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368]
    >>>         
    ... 
    >>> my_list[1::3]
    [2, 8, 34, 144, 610, 2584, 10946, 46368]
    

    【讨论】:

    • 这种情况有效,但是因为您依赖于切片和按索引步进,所以它不是一个可移植的解决方案。
    • 我看到你正在分割列表,但是有两个冒号?这个方法叫什么?
    • @Erty -- 第三个数字是“步幅”。你从第一个元素开始,然后再取第三个元素。
    【解决方案7】:

    遍历列表并使用模运算符检查偶数

    for number in list:
        if (number % 2) == 0: 
            ##EVEN
    

    【讨论】:

    • 不,列表推导更适合这种事情
    • 同意...我以前从未见过他们。它们看起来又快又高效!
    【解决方案8】:

    只是为了好玩,检查number%2 != 1是否也有效;)

    evens=[x for x in evens_and_odds if number%2 != 1 ]
    

    请注意,您可以做一些聪明的事情来在一个循环中分离偶数和赔率:

    evens=[]
    odds=[]
    numbers=[ evens, odds ]
    for x in evens_and_odds:
        numbers[x%2 == 1].append(x)
    
    print evens
    print odds   
    

    上述技巧有效,因为逻辑表达式(==&gt; 等)对数字 True (1) 和/或 False (0) 进行操作。

    【讨论】:

      【解决方案9】:

      您可以使用list comprehension 生成一个新列表,其中仅包含原始列表中的偶数成员。

      data = [1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]
      

      然后:

      new_data = [i for i in data if not i%2]
      

      产量

      [2, 8, 34, 144]
      

      如果您不需要所有数字,也可以使用生成器表达式 一次:

      new_data = (i for i in data if not i%2)
      

      然后可以根据需要使用这些值,例如,如果您使用 for 循环:

      例如,

      for val in new_data:
         print val
      

      生成器表达式的优点是整个列表不会立即生成并存储在内存中,而是根据需要生成值,从而减少对内存的需求。如果您有兴趣,可能需要在某个时候阅读其他重要的差异。

      【讨论】:

        【解决方案10】:

        与其生成所有斐波那契数然后过滤偶数,为什么不只生成偶数?

        def even_fibs():
            a,b = 1,2
            while True:
                yield b
                a,b = a+2*b, 2*a+3*b
        

        生成 [2, 8, 34, 144, 610, 2584, 10946 ...]

        那么你的总和代码变为:

        total = 0
        for f in even_fibs():
            if f >= 4000000:
                break
            else:
                total += f
        

        from itertools import takewhile
        total = sum(takewhile(lambda n: n<4000000, even_fibs()))
        

        【讨论】:

          【解决方案11】:

          您可以使用以下过滤器功能来做到这一点:

          F = [1, 2]
          while F[-1] < 4000000:
              F.append(F[-1] + F[-2])
          print(F)
          print('\n')
          #create the variable that could store the sorted values from the list you have created.
          sorted_number=list(filter(lambda x:x%2==0,F))
          print(sorted_number)
          

          【讨论】:

            【解决方案12】:

            您可以使用长度函数使用 for 和 if 循环,如下所示:

            for x in range(len(numList)):
                if x%2 == 0:
                    print(x)
                    NewList.append(x)
            

            【讨论】:

              【解决方案13】:

              基本上,您应该创建一个变量并将列表放入,然后通过仅添加偶数来对偶数列表进行排序

              numbers = [1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, ...] even = [e for e in numbers if e%2==0]

              【讨论】:

                【解决方案14】:

                这里有一些获得偶数的不同方法

                案例 1 在这种情况下,您必须提供一个范围

                lst = []
                for x in range(100):
                    if x%2==0:
                    lst.append(x)
                print(lst)
                

                案例 2 这是一个函数,你必须传递一个参数来检查它是否是偶数 def 偶数(范围号): 对于范围内的 x(范围号): 如果 rangeno%2 == 0: 返回范围无 别的: return 'No an Even No'

                 even(2)
                

                案例 3 通过列表理解的函数检查 100 范围内的值以获取偶数

                def even(no):
                return [x for x in range(no) if x%2==0]
                
                even(100)
                

                案例 4 这种情况下检查列表中的值并通过 lambda 函数打印偶数。而这个案例就适合上面的问题

                lst = [2,3,5,6,7,345,67,4,6,8,9,43,6,78,45,45]
                no = list(filter(lambda x: (x % 2 == 0), lst))
                print(no)
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-05-24
                  • 2017-02-06
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-05-27
                  • 1970-01-01
                  • 2022-01-25
                  相关资源
                  最近更新 更多