代码之家  ›  专栏  ›  技术社区  ›  Falmarri

列表理解问题

  •  5
  • Falmarri  · 技术社区  · 14 年前

    有没有一种方法可以在每次迭代的列表理解中向列表中添加多个项?例如:

    y = ['a', 'b', 'c', 'd']
    x = [1,2,3]
    
    return [x, a for a in y]
    

    输出: [[1,2,3], 'a', [1,2,3], 'b', [1,2,3], 'c', [1,2,3], 'd']

    3 回复  |  直到 14 年前
        1
  •  6
  •   Community Reversed Engineer    7 年前

    当然有,但不是简单的列表理解:

    编辑:灵感来自另一个答案:

    y = ['a', 'b', 'c', 'd']
    x = [1,2,3]
    
    return sum([[x, a] for a in y],[])
    

    工作原理:sum将添加一个任何事物的序列,只要 __add__ 成员来做这项工作。但是,它以最初的总数0开始。不能将0添加到列表中,但可以 sum() 另一个起始值。这里我们使用空列表。

    如果您只需要一个生成器,而不需要实际的列表,那么可以使用 itertools.chain.from_iterable ,它只是将一组迭代器串成一个长迭代器。

    from itertools import *
    
    return chain.from_iterable((x,a) for a in y)
    

    或者更友好的itertools:

    return itertools.chain.from_iterable(itertools.izip(itertools.repeat(x),y))
    

    当然,还有其他方法:首先,我们可以改进亚当·罗森菲尔德的 answer 通过消除不需要的lambda表达式:

    return reduce(list.__add__,([x, a] for a in y))
    

    因为list已经有了一个成员,可以满足我们的需求。我们可以用同样的方法 map 以及副作用 list.extend :

    l = []
    map(l.extend,[[x, a] for a in y])
    return l
    

    最后,让我们进行一个纯粹的列表理解,尽可能不雅:

    return [ y[i/2] if i%2 else x for i in range(len(y)*2)]
    
        2
  •  1
  •   Adam Rosenfield    14 年前

    有一种方法:

    y = ['a', 'b', 'c', 'd']
    x = [1,2,3]
    
    return reduce(lambda a,b:a+b, [[x,a] for a in y])
    
        3
  •  1
  •   nate c    14 年前
    x = [1,2,3]
    y = ['a', 'b', 'c', 'd']
    z = []
    
    [z.extend([x, a]) for a in y]
    

    (正确值将以z为单位)