2017-08-03 34 views
3

所以我的元組這樣的事情Python的數組元組組首先,存儲第二

query_results = [("foo", "bar"), ("foo", "qux"), ("baz", "foo")] 

一個數組,我想實現的東西,如:

{ 
    "foo": ["bar", "qux"], 
    "baz": ["foo"] 
} 

所以我已經嘗試使用這

from itertools import groupby 

grouped_results = {} 
for key, y in groupby(query_results, lambda x: x[0]): 
    grouped_results[key] = [y[1] for u in list(y)] 

我的問題是,雖然按鍵的數量是正確的,值的每個陣列中的數量是DRAM低於應有的水平。任何人都可以解釋爲什麼會發生這種情況,我應該做什麼?

+0

此:'[Y [1]中的U列表(Y)]'應'[用於ü沿y U [1]]' –

+0

另外,筆記,'itertools.groupby'的工作方式如下:'[k for k,g in groupby('AAAABBBCCDAABBB')] - > ABCDAB' –

回答

5

您更好地使用這個defaultdict

from collections import defaultdict 

result = defaultdict(list) 

for k,v in query_results: 
    result[k].append(v) 

其中產量:

>>> result 
defaultdict(<class 'list'>, {'baz': ['foo'], 'foo': ['bar', 'qux']}) 

如果您想再次字典把它變成一個香草,你可以 - 在for循環後 - 使用:

result = dict(result) 

這隨後導致:

>>> dict(result) 
{'baz': ['foo'], 'foo': ['bar', 'qux']} 

一個defaultdict構造有工廠,這裏list。如果在字典中找不到密鑰,則稱該工廠(list()構造新的空列表)。結果然後與密鑰關聯。

因此,對於還沒有在詞典中的每個鍵k,我們將首先構造一個新列表。然後,我們在該列表上調用.append(v)以向其附加值。

+0

爲什麼不使用簡單的字典? –

+2

@SamChats:因爲它更優雅,並且易於改變,如果一個人想要使用集合而不是列表。你的代碼構造了很多空的列表,這些列表立即被省略。此外,列表附加'+'在* O(n)*中起作用,使得算法* O(n^2)*。 –

+0

感謝您的澄清。我懷疑我的代碼是否會放大。而且,你的意思是'O + n在O(n)中工作,'append'在O(n^2)中工作? –

1

使用defaultdict怎麼樣?

d = defaultdict(list) 
for pair in query_results: 
    d[pair[0]].append(pair[1]) 
+0

太棒了。但是我認爲使用'key,value'比'pair'和'pair [1]'使用'pair'更好。 –

+0

你是對的 - 它使它更具可讀性 –

2

那麼爲什麼不能用一個簡單的循環for

grouped_results = {} 
for key, value in query_results: 
    grouped_results.setdefault(key, []).append(value) 

輸出:

{'foo': ['bar', 'qux'], 'baz': ['foo']} 
+1

@ juanpa.arrivillaga謝謝!我編輯了我的代碼。但是我沒有添加'defaultdict',因爲它會讓我的答案變得冗餘。 –

相關問題