【问题标题】:Convert tuple containing tuple into dictionary将包含元组的元组转换为字典
【发布时间】:2017-05-15 10:46:02
【问题描述】:

设置

我有一个包含元组的列表,每个元组都包含一个元组。

部分列表,

l = [ ('E', ('1058GK', '1058GK')),
      ('K', ('1058GL', '1058GN')),
      ('E', ('1058GP', '1058HC')),
      ('K', ('1058HD', '1058LT'))]

问题

我想将l 转换为这样的字典,

d = {'E': ['1058GK','1058GK','1058GP','1058HC'],
     'K': ['1058GL','1058GN','1058HD','1058LT']}

我该怎么办?


试过

d = {k:v for k,v in l} 让我接近,但这会创造,

d = {'E': ('1058GP','1058HC'),
     'K': ('1058HD','1058LT')}

【问题讨论】:

  • 到目前为止你做了什么吗?

标签: python dictionary tuples


【解决方案1】:

你可以使用setdefault:

d = {}
for key, lst in l:
    d.setdefault(key, []).extend(lst)

# results in
# d = {'E': ['1058GK', '1058GK', '1058GP', '1058HC'], 
#      'K': ['1058GL', '1058GN', '1058HD', '1058LT']}

如果key 不在字典中,它将被添加,包含一个空列表。然后使用相应元组中的元素扩展列表。


或者你可以使用defaultdict:

from collections import defaultdict

d = defaultdict(list)

for key, lst in l:
    d[key].extend(lst)

【讨论】:

    【解决方案2】:
    l = [ 
        ('E', ('1058GK', '1058GK')),
        ('K', ('1058GL', '1058GN')),
        ('E', ('1058GP', '1058HC')),
        ('K', ('1058HD', '1058LT'))
    ]
    res = dict()
    for elem in l:
        res[elem[0]] = res.get(elem[0], []) + list(elem[1])
    

    【讨论】:

      【解决方案3】:

      由于原始列表中的键可能出现多次,因此最好循环浏览您的列表。您可以明智地浏览列表元素并立即将外部元组拆分为键元素对,如下所示:

      l = [ ('E', ('1058GK', '1058GK')),
            ('K', ('1058GL', '1058GN')),
            ('E', ('1058GP', '1058HC')),
            ('K', ('1058HD', '1058LT'))]
      mydict = {}
      for key, tup in l:
          try:
              mydict[key]+=list(tup)
          except KeyError:
              mydict[key]=list(tup)
      
      print(mydict)
      

      try-except 块确保不同的键确实存在于 mydict 中,如果它们不存在,则相应地创建它们。

      【讨论】:

        【解决方案4】:

        我觉得还可以

        d = {k:[] for (k, v) in l}
        for (k, v) in l:
            d[k] += list(v)
        print(d)
        

        首先它分配一个空列表字典。然后遍历 l 的元素,将元组转换为列表,并根据键 k 合并它们。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-03-28
          • 2011-04-03
          • 1970-01-01
          • 1970-01-01
          • 2023-03-08
          • 2013-04-01
          相关资源
          最近更新 更多