组合使用列表推导返回列表的函数列表

时间:2016-07-30 21:04:44

标签: python python-2.7

我想填充三个列表:ABC

我有一个基于单数输入的函数返回应附加到每个列表的N个对象。也就是说,f会返回stuff_for_Astuff_for_Bstuff_for_C,其中每个stuff都是包含N个项目的列表。我想将加入各自列入各自的列表,因为我循环遍历将{1}}输入发送的迭代。

如何编写超快列表理解来创建这3个列表?

注意:我可以重构f的输出(例如将项目压缩在一起),如果这样可以使事情变得更容易。

编辑:这里有一些伪代码,底部列表理解不正确。

f

4 个答案:

答案 0 :(得分:1)

您希望获得与

相同的结果
A = [create_A_list(input) for input in iterable]
B = [create_B_list(input) for input in iterable]
C = [create_C_list(input) for input in iterable]

但只有一次通过iterable。使用明确的for循环,您将使用

A = []
B = []
C = []
for input in iterable:
    A.append(create_A_input(input))
    B.append(create_B_input(input))
    C.append(create_C_input(input))

使用单个列表理解,您可以获得三元组列表:

triples = [ (create_A_input(input),
             create_B_input(input),
             create_C_input(input)) for input in iterable ]

然后您可以转换为三个列表:

A, B, C = map(list, zip(*[(create_A_input(input),
                           create_B_input(input),
                           create_C_input(input)) for input in iterable]))

您原来的f函数会返回一个三元组,因此您可以使用它代替前面的三元组:

A, B, C = map(list, zip(*[f(input) for input in iterable)]))

答案 1 :(得分:1)

要从返回的元组创建列表,您可以在生成器表达式上使用zip解压缩的多重赋值:

def f(input):
    ...
    return stuff_for_A,stuff_for_B,stuff_for_C

A, B, C = zip(*(f(input) for input in iterable))

这将返回以3个元组分组的每个列表的相应项目。

试验:

>>> A, B, C = zip(*[(1,2,3), (4,5,6), ('x', 'y', 'z'), (8,9,0)])
>>> A
(1, 4, 'x', 8)
>>> B
(2, 5, 'y', 9)
>>> C
(3, 6, 'z', 0)

要将它们作为列表返回,您可以将列表理解与之前的操作一起使用:

>>> A, B, C = [list(i) for i in zip(*[(1,2,3), (4,5,6), ('x', 'y', 'z'), (8,9,0)])]
>>> A
[1, 4, 'x', 8]
>>> B
[2, 5, 'y', 9]
>>> C
[3, 6, 'z', 0]

如果函数返回3个迭代的元组,那么您可以使用itertools.chain来展平zip的结果:

from itertools import chain

A, B, C =  (list(chain.from_iterable(i))
            for i in zip(*(f(input) 
                           for input in iterable)))

答案 2 :(得分:1)

If A, B, and C exist, the following will update them with the returned values from f:

list(map(lambda x: x[0].extend(x[1]), zip([A,B,C], f())))

list is called, cause map is lazy in python 3.

答案 3 :(得分:0)

直接扩展A,B,C而不返回东西?

iterable = range(10)
A, B, C = [], [], []

def f(item):
    A.extend([item * 2])
    B.extend([item * 3])
    C.extend([item * 4])

map(f, iterable)
print A
print B
print C

https://repl.it/Chl6

(我在内部使用.extend()列表,因为您的函数会返回列表,否则请使用A.add(thing)添加单个内容。我还将input重命名为item因为{{1}是Python中的内置函数