我有一个元组列表,而这些元组又包含两个列表。例如:
big_list = [
(["A", "B", "C"], [1, 2]),
(["X", "Y"], [9, 8, 7]),
]
我想在(字母,数字)的每个组合上调用一些函数。 我目前有一个非常丑陋的三个嵌套for循环,沿着以下几行:
for (letters, numbers) in big_list:
for letter in letters:
for number in numbers:
do_stuff(letter, number)
也就是说,我希望do_stuff
为我的列表中的每个(字母,数字)组合调用一次。
将这三个循环折叠成一个或两个是否可行?最好是以一种不丑陋和不顺便的方式?
答案 0 :(得分:3)
我认为itertools
可能有所帮助:
import itertools
for (letters, numbers) in big_list:
for (letter, number) in itertools.product(letters, numbers):
do_stuff(letter, number)
这可以节省一个循环,所以现在你只需要一个嵌套循环来处理。而且我认为它更像是Pythonic。
答案 1 :(得分:1)
您还可以将itertools.product
与starmap
和chain.from_iterable
结合使用:
from itertools import chain, starmap, product
for l, n in chain.from_iterable(starmap(product, big_list)):
print(l, n)
当然,这是否更明确是一个意见问题。或者只使用生成器表达式:
for l, n in (p for ls, ns in big_list for p in product(ls, ns)):
print(l ,n)
两种方式,结果(list
)都是[('A', 1), ('A', 2), ('B', 1), ('B', 2), ('C', 1), ('C', 2), ('X', 9), ('X', 8), ('X', 7), ('Y', 9), ('Y', 8), ('Y', 7)]
。