2013-11-26 60 views
0

我有以下項目(鍵 - 值對)的列表:在python中 - 如何將項目轉換爲字典?

items = [('A', 1), ('B', 1), ('B', 2), ('C', 3)] 

我想什麼:

{ 
    'A' : 1, 
    'B' : [1,2] 
    'C' : 3 
} 

我天真的解決方案:

res = {} 
for (k,v) in items: 
    if k in res: 
     res[k].append(v) 
    else: 
     res[k] = [v] 

我期待對於一些優化更多pythonic解決方案,任何人?

+0

爲什麼downvoting? – mnowotka

+0

使用列表字典理解解決方案。 –

回答

4

使用可以在這裏使用defaultdict。

from collections import defaultdict 

res = defaultdict(list) 
for (k,v) in items: 
    res[k].append(v) 
# Use as dict(res) 

編輯:

這是使用GROUPBY,但請注意,上述是更乾淨和整潔眼睛

>>> data = [('A', 1), ('B', 1), ('B', 2), ('C', 3)] 
>>> dict([(key,list(v[1] for v in group)) for (key,group) in groupby(data, lambda x: x[0])]) 
{'A': [1], 'C': [3], 'B': [1, 2]} 

下行:每一個元素是一個列表。根據需要將列表更改爲生成器。


對所有單個項目列表轉換爲單個項目:

>>> res = # Array of tuples, not dict 
>>> res = [(key,(value[0] if len(value) == 1 else value)) for key,value in res] 
>>> res 
[('A', 1), ('B', [1, 2]), ('C', 3)] 
+0

任何避免顯式循環的方法? – mnowotka

+0

不,你做的任何事情都必須通過「項目」循環。 –

0

這是很容易做到defaultdict,這可以從collections進口。

>>> from collections import defaultdict 
>>> items = [('A', 1), ('B', 1), ('B', 2), ('C', 3)] 
>>> d = defaultdict(list) 
>>> for k, v in items: 
    d[k].append(v) 
>>> d 
defaultdict(<class 'list'>, {'A': [1], 'C': [3], 'B': [1, 2]}) 

可以也使用字典理解:

>>> d = {l: [var for key, var in items if key == l] for l in {v[0] for v in items}} 
>>> d 
{'A': [1], 'C': [3], 'B': [1, 2]} 
+0

與其他答案相同的評論 - 是否有任何方法顯式循環? – mnowotka

+0

@mnowotka該死的,對不起重複,但我的網絡有點慢,所以我沒有看到它。我很快就會給你另一個答案。 –

0

可以使用的WebOb multidict實現:

>>> from webob import multidict 
>>> a = multidict.MultiDict(items) 
>>> a.getall('B') 
[1,2] 
1

如果你不想使用defaultdict/groupby ,作品如下:

d = {} 
for k,v in items: 
    d.setdefault(k, []).append(v) 
+0

唯一的差點是所有的值都是列表。如果只有一個引用該鍵的值,OP不希望它們成爲列表。 – FallenAngel

0

也許它看起來很醜,但它的工作原理。

In [1]: items = [('A', 1), ('B', 1), ('B', 2), ('C', 3)] 

In [2]: d = {} 

In [3]: map(lambda i: d.update({i[0]: i[1] if d.get(i[0], i[1]) == i[1] else [d[i[0]], i[1]]}), items) 
Out[3]: [None, None, None, None] 

In [4]: print d 
{'A': 1, 'C': 3, 'B': [1, 2]} 

else分支,我們可以檢查是否d[i[0]]返回一個列表。