我需要将上面的元组列表转换为嵌套字典而不覆盖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方法来做到这一点?
答案 0 :(得分:1)
以下是使用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
方法更清晰,更快:
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',)}}}
答案 1 :(得分:0)
扩展@MosesKoledoye答案,如果字典中的第一个值仅为'a'
和'b'
,则您知道外部字典最多只能使用{{1}包含一个元素}作为键,内部字典将始终包含使用'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}