Python 将元组列表(每个3个元素)转换为dict{a:{b:set(c)}

Python 将元组列表(每个3个元素)转换为dict{a:{b:set(c)},python,python-2.7,Python,Python 2.7,我有一个三元素元组的列表,比如[(a1,b1,c1),(a2,b2,c2),(a2,b2,c3)] 我想把元组列表转换成类似dict的格式 {a1:{b1:set(c1)},a2:{b2:set(c2,c3)} 本质上,需要将c放入一个集合中 如何为此编写一段漂亮的代码 这是我目前的代码: s = {} for a,b,c in abc: s.setdefault(a, {}).setdefault(b, set()).add(c) 您可以使用,它将自动为缺少的关键点创建默认值,以执

我有一个三元素元组的列表,比如
[(a1,b1,c1),(a2,b2,c2),(a2,b2,c3)]

我想把元组列表转换成类似dict的格式

{a1:{b1:set(c1)},a2:{b2:set(c2,c3)}

本质上,需要将
c
放入一个集合中

如何为此编写一段漂亮的代码


这是我目前的代码:

s = {}
for a,b,c in abc:
    s.setdefault(a, {}).setdefault(b, set()).add(c)
您可以使用,它将自动为缺少的关键点创建默认值,以执行此操作:

>>> from collections import defaultdict
>>> structure = defaultdict(lambda: defaultdict(set))
>>> for a, b, c in ['foo', 'bar', 'baz']:
    structure[a][b].add(c)


>>> structure
defaultdict(<function <lambda> at 0x02D16F30>, 
            {'b': defaultdict(<type 'set'>, {'a': set(['r', 'z'])}), 
             'f': defaultdict(<type 'set'>, {'o': set(['o'])})})
请注意,
setdefault
也可用于第一种方法,但:

structure.setdefault(a, dict()).setdefault(b, set()).add(c)
其可读性不如:

structure[a][b].add(c)

您可以使用
.setdefault
执行此操作。它创建新的键并分配默认值,这样我们就可以在一条语句中创建任意级别的字典。 代码:


这种结构有什么特别的原因吗?例如,为什么不
{(a2,b2):set([c2,c3]),…}
?你调查过吗@AvinashRaj添加了我现有的代码,那么您当前的代码有什么问题?如果要查看工作代码,请参阅
structure[a][b].add(c)
tuple_list = [(a1, b1, c1), (a2, b2, c2), (a2, b2, c3)]
new_dict = {}
for grp in tuple_list:
    new_dict.setdefault(grp[0], {}).setdefault(grp[1], set()).add(grp[2])