【问题标题】:Converting List of 3 Element Tuple to Dictionary将 3 元素元组列表转换为字典
【发布时间】:2013-01-10 17:16:06
【问题描述】:

如果我有两个元组列表

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 元素元组来创建字典?

任何指针表示赞赏或指向我可以在此阅读更多内容的地方。在互联网上找不到它。

【问题讨论】:

  • Python 变量名不能以整数开头。
  • 您的 "3tuplelist2dict" 是一个字典,其键 4 列出了两次。这不是一个有效的 Python 字典。 “2tuplelist2dict”也有同样的问题。
  • @unutbu 和 GWW -- 抱歉我打错了。已在上面适当地纠正它。感谢您强调

标签: python


【解决方案1】:

在 Python2.7 或更高版本中,您可以使用字典推导:

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 元组使用共享密钥。

【讨论】:

  • 无论如何它不会被覆盖并保留所有 {key:{key:value}} 对。
  • 在这种情况下,您不能使用字典。您必须使用元组或列表。
  • 或者,第二个,如果值是一个列表,你可以使用一个字典。例如,{4: [{0:7}, {180:21}]}
【解决方案2】:

这个pair-case很简单,因为它与dict construction对齐:

...位置参数必须是迭代器对象。可迭代对象中的每个项目本身必须是具有正好两个对象的迭代器。每个项目的第一个对象成为新字典中的键,第二个对象成为对应的值。

>>> 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 中,您可以使用字典推导:

>>> 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]}

【讨论】:

  • 请注意,在 3.x 中,存在扩展解包,因此对于一般情况,可以简单地使用 {key: values for key, *values in t},这读起来非常好。
  • @Lattyware,确实不错,感谢提示,更新了我的答案。
  • @miku 感谢您的 cmets,学到了新东西。我在 4 和变量名称上打错了字,已在上面进行了适当的更正。 tuple3list 是否可以像 tuple3list2dict 一样创建具有 {key{key:value}} 关系的字典?如果有任何我可以随时阅读的示例,请指出我。
【解决方案3】:

如果想要一个嵌套字典而不覆盖字典,可以使用collections 库中的defaultdict

>>> 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

不幸的是,单行分配很棘手或不可能,因此我认为唯一有效的解决方案是这个。

【讨论】:

    猜你喜欢
    • 2013-04-01
    • 1970-01-01
    • 2010-09-20
    • 2017-06-07
    相关资源
    最近更新 更多