使用列表理解的偶数索引的偶数列表

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]

如果你想在两者之间添加 0s,那么你可以做一点 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]

好吧,那是很多括号和圆括号,让我们仔细看看:

  1. list(...)[:-1]... 转换为 list 并获取该列表中除最后一个元素以外的所有元素。这类似于您在添加 0 并删除最后一个

  2. 时尝试执行的操作
  3. (num for i,num in enumerate(L) if not num%2 and not i%2)与编辑前一样,只是用括号(())代替了方括号([])。这将它变成了生成器推导式,而不是列表推导式——重要的是它执行了一点优化——直到需要时才计算值(直到 zip 请求下一个值)

  4. itertools.cycle([0]) 给出了 0s

  5. 的无限列表
  6. zip(A, B) returns一个元组列表,其中第i个元组有两个元素——[=的第i个元素27=],以及B

  7. 的第i个元素
  8. itertools.chain.from_iterable(zip(A, B)) returns AB的元素交错,作为一个生成器。本质上,就像这样做:


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]