Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用列表理解在偶数索引处的偶数列表_Python_List Comprehension - Fatal编程技术网

Python 使用列表理解在偶数索引处的偶数列表

Python 使用列表理解在偶数索引处的偶数列表,python,list-comprehension,Python,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
。我已经完成了与下面相同的功能

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
为输出):

范围(10)
生成一个从0到9的整数列表。 对于这个列表,我应用了一个映射,它将列表中的所有奇数转换为0,而不处理偶数(
lambda x:x,如果x%2==0,则为0,否则为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]
给定一个列表,获取偶数索引下的所有数字。如果这些数字中的任何一个是偶数,请将其放入新列表并返回:

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
magic:

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]
    ..
    转换为
    列表
    并获取该列表中除最后一个元素以外的所有元素。这与添加
    0
    s并删除最后一个时的操作类似

  • (num代表i,num在枚举(L)中如果不是num%2而不是i%2)
    与编辑之前相同,只是它使用括号(
    ()
    )而不是括号(
    []
    )。这将它转换为生成器理解,而不是列表理解-它只需要执行一点点优化-直到需要时才计算值(直到
    zip
    请求下一个值)

  • itertools.cycle([0])
    给出了无限的
    0
    s列表

  • zip(A,B)
    返回元组列表,其中
    i
    th元组有两个元素,
    A
    i
    th元素和
    B
    i
    th元素

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

  • def someFunc(A,B): 对于范围内的i(len(A)): 产生A[i] 收益率B[i]
    因此,所有这些加在一起就可以给你想要的东西了

    你可以根据预期的输出来尝试。但是你必须知道,
    列表理解
    并不比
    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]
    

    您能添加输入/预期输出吗?您是否忘记了代码中的
    其他:
    ?您见过
    xrange(0,end,2)
    ?@jornsharpe是的,我知道不是,我试图提出一个我无法解决的问题,完全符合SO的规则。我投票将此问题作为离题题结束,因为它不太可能帮助其他用户。谢谢,我也尝试了同样的方法,但我需要在out列表中的奇数索引处附加0。这对我来说有点挑战。添加了输入和out@RohitSrivastava:查看editMind来解释一下吗?我添加了一些细节:)
    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]
    
    def someFunc(A, B): for i in range(len(A)): yield A[i] yield B[i]
    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]