循环遍历列表对的元素

时间:2017-09-18 15:22:39

标签: python

我有一个元组列表,而这些元组又包含两个列表。例如:

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为我的列表中的每个(字母,数字)组合调用一次。

将这三个循环折叠成一个或两个是否可行?最好是以一种不丑陋和不顺便的方式?

2 个答案:

答案 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.productstarmapchain.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)]

相关问题