我想填充三个列表:A
,B
和C
我有一个基于单数输入的函数返回应附加到每个列表的N个对象。也就是说,f
会返回stuff_for_A
,stuff_for_B
,stuff_for_C
,其中每个stuff
都是包含N个项目的列表。我想将加入各自列入各自的列表,因为我循环遍历将{1}}输入发送的迭代。
如何编写超快列表理解来创建这3个列表?
注意:我可以重构f
的输出(例如将项目压缩在一起),如果这样可以使事情变得更容易。
编辑:这里有一些伪代码,底部列表理解不正确。
f
答案 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
(我在内部使用.extend()
列表,因为您的函数会返回列表,否则请使用A.add(thing)
添加单个内容。我还将input
重命名为item
因为{{1}是Python中的内置函数