使用列表推导在偶数索引处的偶数列表

时间:2015-03-30 14:45:18

标签: python list-comprehension

我正在尝试使用列表推导在偶数索引位置生成偶数编号列表。 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]

4 个答案:

答案 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]

好的,这是很多括号和括号,所以让我们仔细看看它:

  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])提供了无穷无尽的0 s

  5. 列表
  6. zip(A, B)返回元组列表,其中i元组有两个元素 - i元素A和{{ 1}} i

  7. 的元素
  8. B返回itertools.chain.from_iterable(zip(A, B))A交错的元素作为生成器。从本质上讲,它就像这样做:

  9. 
    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]