2017-09-18 254 views
3

我有一個元組列表,它又包含兩個列表。例如:循環遍歷列表對的元素

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被調用一次,對(字母,數字)存在於每個組合我名單。

將這三個環合併爲一個或兩個可行嗎?最好採用不醜陋,不平行的方式?

+1

你所得到的沒有錯。這是最直接的方式。 –

+0

@acdr:請看第二個答案,我已經完成了一個循環和一個地圖 – Serjik

回答

3

我認爲itertools可以幫助:

import itertools 

for (letters, numbers) in big_list: 
    for (letter, number) in itertools.product(letters, numbers): 
     do_stuff(letter, number) 

這樣可以節省一個循環,所以現在你只有一個嵌套循環來處理。而且我認爲它更多是Pythonic。

1

你也可以用starmapchain.from_iterable結合itertools.product

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)]