如果我有两个元组列表
tuple2list=[(4, 21), (5, 10), (3, 8), (6, 7)]
tuple3list=[(4, 180, 21), (5, 90, 10), (3, 270, 8), (6, 0, 7)]
如何将其转换为字典,如下所示
tuple2list2dict={4:21, 5:10, 3:8, 6:7}
tuple3list2dict={4: {180:21}, 5:{90:10}, 3:{270:8}, 6:{0:7}}
我知道如何使用
为元组中的2个元素执行此操作tuple2list2dict=dict((x[0], index) for index,x in enumerate(tuple2list))
但是对于3个元素我有问题,尝试下面的错误,
tuple3list2dict=dict((x[0], dict(x[1], index)) for index,x in enumerate(tuple3list))
如何重复上述代码用于3元组元组来创建字典?
任何指针都赞赏或指出我可以在这里阅读更多内容。无法在互联网上找到它。
答案 0 :(得分:9)
在Python2.7或更高版本中,您可以使用dict理解:
In [100]: tuplelist = [(4, 180, 21), (5, 90, 10), (3, 270, 8), (4, 0, 7)]
In [101]: tuplelist2dict = {a:{b:c} for a,b,c in tuplelist}
In [102]: tuplelist2dict
Out[102]: {3: {270: 8}, 4: {0: 7}, 5: {90: 10}}
在Python2.6或更早版本中,等价物将是
In [26]: tuplelist2dict = dict((a,{b:c}) for a,b,c in tuplelist)
请注意,如果元组中的第一个值出现多次,(如上例所示),结果tuplelist2dict
只包含一个键值对 - 对应于 last 使用共享密钥的元组。
答案 1 :(得分:2)
这种情况很简单,因为它与dict construction对齐:
...位置参数必须是迭代器对象。 iterable中的每个项目本身必须是一个迭代器,其中正好是两个对象。每个项目的第一个对象成为新词典中的一个键,第二个对象成为相应的值。
>>> t = [(4, 21), (5, 10), (3, 8), (4, 7)]
>>> dict(t)
{3: 8, 4: 7, 5: 10}
三重案例可以通过这种方式解决:
>>> t = [(4, 180, 21), (5, 90, 10), (3, 270, 8), (4, 0, 7)]
>>> dict([ (k, [v, w]) for k, v, w in t ])
{3: [270, 8], 4: [0, 7], 5: [90, 10]}
或者更一般:
>>> dict([ (k[0], k[1:]) for k in t ]) # hello car, hi cdr
{3: (270, 8), 4: (0, 7), 5: (90, 10)}
请注意您的代码:
_3_tuplelist_to_dict = {4: {180:21}, 5:{90:10}, 3:{270:8}, 4:{0:7}}
实际上只是一个令人困惑的代表:
{3: {270: 8}, 4: {0: 7}, 5: {90: 10}}
尝试:
>>> {4: {180:21}, 5:{90:10}, 3:{270:8}, 4:{0:7}} == \
{3: {270: 8}, 4: {0: 7}, 5: {90: 10}}
True
使用Python 3,您可以使用dict理解:
>>> t = [(4, 180, 21), (5, 90, 10), (3, 270, 8), (4, 0, 7)]
>>> {key: values for key, *values in t}
{3: [270, 8], 4: [0, 7], 5: [90, 10]}
答案 2 :(得分:0)
如果想要嵌套字典而不覆盖字典,可以使用defaultdict
库中的collections
。
>>> from collections import defaultdict
>>> # Edited the list a bit to show when overrides
>>> tuple3list=[(4, 180, 21), (4, 90, 10), (3, 270, 8), (6, 0, 7)]
>>> tuple3dict = defaultdict(dict)
>>> for x, y, z in tuple3list:
... tuple3dict[x][y] = z
...
>>> print(tuple3dict)
defaultdict(<class 'dict'>, {4: {180: 21, 90: 10}, 3: {270: 8}, 6: {0: 7}})
>>> tuple3dict[4][90]
10
不幸的是,一行分配很棘手或不可能,因此我认为唯一有效的解决方案就是这个。