在Python中生成偶数列表

11

基本上我需要帮助在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整除,那么将其加入目标列表中。 - Robert Harvey
4
你尝试过哪些不同的方法? - Wooble
3
有点奇怪,你在筛选列表之前就生成了一个斐波那契数列... ;) - Jon Clements
14个回答

25

使用列表推导式(参见:在Python中搜索对象列表

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

这样做很好,因为它保留了列表的原貌,并且您可以像操作普通列表对象一样操作evensList。

希望这能有所帮助!


1
我认为列表推导式可能对于初学Python的前几天来说有点过于高级了...但这只是我的个人意见! - Trufa
1
@Trufa 列表推导式是 Python 中最好的部分之一... 为什么不早点介绍它们呢? - Colin Dunklau
哦,我同意,但这是最佳实践 - 它会让他拥有一个列表对象。 - Erty Seidohl
我认为在学习列表推导式之前,先了解for循环的细节会更有益健康。但这只是我的个人看法。 - Trufa
为了让代码更简洁,你可以使用 if not x%2 代替 if x % 2 == 0 - bohnpessatti

6
以下示例应该可以解决您的问题。
Newlist = []
for x in numList:
   if x % 2 == 0:
      print x          
      Newlist.append(x)

这是如果您想打印所有偶数的代码 - 如果您想获得一个可操作的列表,请参见下面的答案。编辑:我看到新版本将其附加到一个新列表中 :) - Erty Seidohl

4
你可以使用列表推导式 来完成这个操作
evens = [n for n in numbers if n % 2 == 0]

你也可以使用 filter 函数

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

如果列表非常长,可能希望创建一个迭代器来遍历列表,而不是使用{{link1:itertools}}中的ifilter创建其一半的副本:
from itertools import ifilter
evens = ifilter(lambda x: x % 2 == 0,numbers)

或者使用 生成器表达式

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

OP,这是一个很好的答案,但请考虑lambda表达式对于Python的初学者来说可能有点过于高级了 :) - Trufa
呃,ifilter?只需要(x for x in numbers if not x % 2)就可以了。 - Katriel
已经添加了一个生成器表达式,尽管我选择了 n % 2 ==0 - David Webb

3
在您的特定情况下,my_list[1::3] 将起作用。在 Fibonacci 数列中,偶数之间始终存在两个奇数:偶数、奇数、奇数、偶数、奇数、奇数...。
>>> 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]

这个案例可以工作,但是因为你依赖于切片和索引步进,所以它不是一个可移植的解决方案。 - jathanism
我看到你在对列表进行切片,但是有两个冒号?这种方法叫什么? - Erty Seidohl
1
@Erty -- 第三个数字是“步幅”。你从第一个元素开始,然后每隔3个元素取一个。 - mgilson

2

只需检查一下

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

1
遍历列表并使用模运算符检查偶数。
for number in list:
    if (number % 2) == 0: 
        ##EVEN

不,列表推导式更适合这种情况。 - Ryan Haining
同意...我以前从未见过它们。它们看起来快速高效! - barbiepylon

0
你可以使用列表推导式从原始列表中生成一个仅包含偶数成员的新列表。
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循环:

e.g.,

for val in new_data:
   print val

生成器表达式的优点在于不会一次性生成和存储整个列表,而是在需要时生成值,这样对内存的需求更小。如果您感兴趣,还有其他重要的区别值得您了解。

0

只是为了好玩,检查一下 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   

上述技巧之所以有效,是因为逻辑表达式(==>等)作用于数字时会返回True(1)和/或False

(0)。

0

不要生成所有的斐波那契数列再筛选偶数,为什么不直接生成偶数呢?

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()))

0
你可以使用filter函数来实现这一点,具体如下所示:
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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接