![](/img/trans.png)
[英]Fast way to create a nested dictionary from a list of tuples without a for loop
[英]List of tuples to nested dictionary without overriding
我需要將上述元組列表轉換為嵌套字典,而不會覆蓋python中的以下值
[('a', '1'),
('b', 'true'),
('b', 'none'),
('a', '2'),
('b', 'true'),
('a', '3'),
('b', 'false')]
{'a': {'1' : { 'b' : ('true','none')},
'2' : { 'b' : ('true')},
'3' : { 'b' : ('false')}}}
使用以下命令將每個元組轉換為字典
dict()
並且合並字典不起作用。 有什么pythonic方法可以做到這一點嗎?
這是使用collections.defaultdict
做到這一點的一種方法:
from collections import defaultdict
import pprint
data = [('a', '1'), ('b', 'true'), ('b', 'none'), ('a', '2'), ('b', 'true'), ('a', '3'), ('b', 'false')]
d = defaultdict(lambda: defaultdict(lambda: defaultdict(tuple)))
for i, j in data:
if i == 'a':
p = d[i][j]
else:
p[i] += j,
pprint.pprint(d)
# {'a': {'1': defaultdict(<class 'tuple'>, {'b': ('true', 'none')}),
# '2': defaultdict(<class 'tuple'>, {'b': ('true',)}),
# '3': defaultdict(<class 'tuple'>, {'b': ('false',)})}}
您也可以使用字典的setdefault
方法返回新鍵的默認值,盡管defaultdict
方法更加defaultdict
快捷:
c = {}
for i, j in data:
if i == 'a':
q = c.setdefault(i, {}).setdefault(j, {})
else:
q[i] = q.setdefault(i, ()) + (j,)
pprint.pprint(c)
# {'a': {'1': {'b': ('true', 'none')},
# '2': {'b': ('true',)},
# '3': {'b': ('false',)}}}
擴展@MosesKoledoye答案,如果字典中的第一個值僅是'a'
和'b'
,則您會知道外部字典將始終包含最多一個以'a'
為鍵的元素,而內部字典將始終包含在使用'b'
作為鍵的大多數元素。 因此,最后如果它是{'1': ('true', 'none')…
您將獲得相同的信息。 您只需將數據包裝在一些字典中即可將其轉換為格式。 這意味着您可以執行以下操作
output = defaultdict(tuple)
for i, j in data:
if i == 'a':
current = j
else:
# i == 'b'
output[current] += (j, )
這將導致以下結果:
defaultdict(<type 'tuple'>, {'1': ('true', 'none'), '3': ('false',), '2': ('true',)})
現在,要將其放入像您一樣的字典中,您可以執行以下操作:
output = {k: {'b': v} for k, v in output.items()}
if output:
output = {'a': output}
結果如下:
{'a': {'1': {'b': ('true', 'none')}, '3': {'b': ('false',)}, '2': {'b': ('true',)}}}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.