我正在尝试使用列表推导在偶数索引位置生成偶数编号列表。 else值将为0
。我完成了与下面相同的功能
def even_list(l):
ll = []
for x in l:
if x%2 == 0:
ll.append(x)
ll.append(0)
return ll[:-1]
现在我需要把它变成列表理解。
input = [11, 17, 12, 17, 40, 19, 12, 16]
out = [12, 0, 40, 0, 12, 0, 16]
这是我尝试过的(l
输入且lo
已输出):
>>> l = [1, 2, 3, 4, 5, 6, 7]
>>> lo = []
>>> lo = [l[x] if l[x]%2 == 0 and len(lo)%2 == 0 else 0 for x in range(len(l))]
>>> print lo
[0, 2, 0, 4, 0, 6, 0]
答案 0 :(得分:1)
>>> list(map(lambda x: x if x % 2 == 0 else 0, range(10)))
[0, 0, 2, 0, 4, 0, 6, 0, 8, 0]
range(10)
生成一个包含0到9整数的列表。
在这个列表中,我应用了一个地图,它将列表中的所有奇数转换为0,并且不对偶数(lambda x: x if x % 2 == 0 else 0
)执行任何操作。
然后我将这张地图重新投射到列表中以获得精美的印刷品。
答案 1 :(得分:1)
我无法确切地从你的帖子中找到你想要的东西,但这就是我认为你想要的东西:
给定一个列表,获取偶数索引处的所有数字。如果这些数字中的任何一个是偶数,请将它们放入新列表并返回:
In [10]: L = [3,1,54,5,2,3,4,5,6,5,2,5,3,2,5,2,2,5,2,5,2]
In [11]: [num for i,num in enumerate(L) if not num%2 and not i%2]
Out[11]: [54, 2, 4, 6, 2, 2, 2, 2]
如果您想在其间添加0
,那么您可以做一点itertools
魔术:
In [12]: list(itertools.chain.from_iterable(zip((num for i,num in enumerate(L) if not num%2 and not i%2), itertools.cycle([0]))))[:-1]
Out[12]: [54, 0, 2, 0, 4, 0, 6, 0, 2, 0, 2, 0, 2, 0, 2]
好的,这是很多括号和括号,所以让我们仔细看看它:
list(...)[:-1]
将...
转换为list
并获取该列表的最后一个元素。这类似于您添加0
并删除最后一个
(num for i,num in enumerate(L) if not num%2 and not i%2)
与编辑前的内容相同,只是它使用括号(()
)而不是括号([]
)。这将其转换为生成器理解,而不是列表理解 - 它只是执行一点优化 - 在需要之前不会计算值(直到zip
要求下一个值)
itertools.cycle([0])
提供了无穷无尽的0
s
zip(A, B)
返回元组列表,其中i
元组有两个元素 - i
元素A
和{{ 1}} i
B
返回itertools.chain.from_iterable(zip(A, B))
和A
交错的元素作为生成器。从本质上讲,它就像这样做:
def someFunc(A, B): for i in range(len(A)): yield A[i] yield B[i]
因此,所有这些组合在一起可以为您提供您想要的内容
答案 2 :(得分:1)
您可以根据预期的输出尝试此操作。但是您必须知道list comprehension
不超过或少于for loop
。
input = [11, 17, 12, 17, 40, 19, 12, 16]
>>>[k for j in [[i,0] for i in input if i%2 == 0] for k in j][:-1]
[12, 0, 40, 0, 12, 0, 16]
答案 3 :(得分:0)
>>> [x if x%2 == 0 else 0 for x in range(20)]
[0, 0, 2, 0, 4, 0, 6, 0, 8, 0, 10, 0, 12, 0, 14, 0, 16, 0, 18, 0]