使用列表理解的偶数索引的偶数列表
List of even numbers at even number indexes using list comprehension
我正在尝试使用列表理解在偶数索引位置生成偶数编号列表。其他值将为 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]
>>> 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
)。
然后我将这张地图重新放入列表中以获得漂亮的打印效果。
>>> [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]
我无法从你的 post 中准确地弄清楚你在寻找什么,但我认为你想要的是:
给定一个列表,获取偶数索引处的所有数字。如果这些数字中的任何一个是偶数,将它们放入一个新列表中,然后 return 它:
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
s,那么你可以做一点 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)
returns一个元组列表,其中第i
个元组有两个元素——[=的第i
个元素27=],以及B
的第i
个元素
itertools.chain.from_iterable(zip(A, B))
returns A
和B
的元素交错,作为一个生成器。本质上,就像这样做:
def someFunc(A, B):
for i in range(len(A)):
yield A[i]
yield B[i]
因此,所有这些加在一起可以满足您的需求
您可以根据您的预期尝试此操作 output.But 您必须知道 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]
我正在尝试使用列表理解在偶数索引位置生成偶数编号列表。其他值将为 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]
>>> 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
)。
然后我将这张地图重新放入列表中以获得漂亮的打印效果。
>>> [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]
我无法从你的 post 中准确地弄清楚你在寻找什么,但我认为你想要的是:
给定一个列表,获取偶数索引处的所有数字。如果这些数字中的任何一个是偶数,将它们放入一个新列表中,然后 return 它:
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
s,那么你可以做一点 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)
returns一个元组列表,其中第i
个元组有两个元素——[=的第i
个元素27=],以及B
的第itertools.chain.from_iterable(zip(A, B))
returnsA
和B
的元素交错,作为一个生成器。本质上,就像这样做:
i
个元素
def someFunc(A, B): for i in range(len(A)): yield A[i] yield B[i]
因此,所有这些加在一起可以满足您的需求
您可以根据您的预期尝试此操作 output.But 您必须知道 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]