2017-02-13 22 views
0

我有一個數據結構,看起來像這樣:什麼是最Python的方式來翻譯(D1,D2)[]爲{D3:D2 []}其中g(D1)產生D3 []

data = [ 
    (16, 'a'), 
    (12, 'b'), 
    (21, 'c'), 
    (30, 'b'), 
    (17, 'd'), 
    ... 
] 

這些數字很大(超過32位),非順序的,非唯一的,而不是按順序。字符串可能會重複。

我有一臺發電機:

def factors(n): 
    for d in range(2, 5): 
    if n % d == 0: 
     yield n 

它可以產生零個或多個值。每個輸入的結果不是唯一的。我需要的是:

result = { 
    2: ['a', 'b', 'b'], # 16, 12, 30 
    3: ['b', 'c', 'b'], # 12, 21, 30 
    4: ['a', 'b']  # 16, 12 
] 

我想盡可能接近標準Python模塊(沒有numpy)。我已經得到了最好是這樣的:

result = {} 
for a, b in data: 
    for c in factors(a): 
    result.setdefault(c).append(b) 

但這種感覺怪怪的,而且我更優雅的使用Python的處理這樣的事情。

+1

爲什麼因素停止' 4'? –

+1

......不,這似乎很像你怎麼做! (假設你的實際代碼是'setdefault(c,[])',你可以使用'defaultdict(list)'而不是'setdefault'。) – Ryan

+0

@MosesKoledoye 4個因素對任何人都應該足夠了(哈哈) 。其實這是爲了證明這份清單可以重複。如果列表中有12和24,則兩者都會生成[2,3,4]。這是草稿中的一個例子,猜測它已經被刪除。 – Hounshell

回答

1

您首先在data上迭代,然後在factors上迭代。我會做的其他方式,因爲這種方式,result建立更自然:

result = {} 
for d in range(2, 5): 
    result[d] = [b for (a,b) in data if a % d == 0] 

或者,如果你覺得夠勇敢做雙重理解:

result = dict((d, [b for (a,b) in data if a % d == 0]) for d in range(2, 5)) 
+0

不幸的是,我不知道提前整套因素。這是一個簡單的例子。 – Hounshell