【问题标题】:tuple to dict:one key and multiple values字典的元组:一个键和多个值
【发布时间】:2012-09-19 04:23:57
【问题描述】:

如何转换元组:

t=(('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C'))

进入字典:

{'1':('a','A'),'2':('b','B'),'3':('c','C')}

我已经在控制台中尝试过:

>>> d={}
>>> t[0]
(1, 'a')
>>> d[t[0][0]]=t[0][1]
>>> d
{1: 'a'}
>>> t[0][0] in d
True
>>> d[t[1][0]]=t[1][1]
>>> d
{1: 'A'}
>>> d[t[0][0]]=t[0][1]
>>> d[t[1][0]]=d[t[1][0]],t[1][1]
>>> d
{1: ('a', 'A')}

现在以下脚本无法完成这项工作:

t=(('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C'))
print "{'1':('a','A'),'2':('b','B'),'3':('c','C')} wanted, not:",dict(t)
d={}

for c, ob in enumerate(t):
   print c,ob[0], ob[1]
   if ob[0] in d:
       print 'test'
       d[ob[0]]=d[ob[0]],ob[1]
       print d

   else:
       print 'else', d, ob[0],ob[1]
       d[ob[0]]=d[ob[1]]           # Errror is here
       print d
print d

我有错误:

Traceback (most recent call last):
  File "/home/simon/ProjetPython/python general/tuple_vers_dic_pbkey.py", line 20, in <module>
    d[ob[0]]=d[ob[1]]
KeyError: 'a'

这似乎与 $>>> d[t[0][0]]=t[0][1]$ 不同。 感谢您的帮助

日本

PS 有没有更好的方法来进行转换?

【问题讨论】:

  • {'1':('a','A') ... 使用元组而不是列表作为值是否重要?
  • 抱歉,我收到错误:应该是 d[ob[0]]=ob[1] 而不是 d[ob[0]]=d[ob[1]]
  • @Waleed Khan:不是真的,一个列表也可以。

标签: python dictionary tuples


【解决方案1】:
import itertools as it
t=(('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C'))

{k:tuple(x[1] for x in v) for k,v in it.groupby(sorted(t), key=lambda x: x[0])}

返回

{'1': ('A', 'a'), '2': ('B', 'b'), '3': ('C', 'c')}

【讨论】:

    【解决方案2】:
    t = (('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C'))
    foo = {}
    for i in t:
        if i[0] not in foo:
            foo[i[0]] = [i[1]]
        else:
            foo[i[0]].append(i[1])
    foo # {'3': ['c', 'C'], '2': ['b', 'B'], '1': ['a', 'A']}
    

    【讨论】:

      【解决方案3】:

      您可以使用集合模块中的defaultdict(尽管它更适用于列表,而不是元组):

      t=(('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C'))
      
      from collections import defaultdict
      d = defaultdict(list)
      for k, v in t:
          d[k].append(v)
      
      d = {k:tuple(v) for k, v in d.items()}
      print d
      

      或者简单地将元组相加:

      t = (('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C'))
      d = {}
      for k, v in t:
          d[k] = d.get(k, ()) + (v,)
      print d    
      

      【讨论】:

        【解决方案4】:
        >>> t=(('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C'))
        >>> d1 = {}
        >>> for each_tuple in t:
            if each_tuple[0] in d1:
                d1[each_tuple[0]] = d1[each_tuple[0]] + list(each_tuple[1])
            else:
                d1[each_tuple[0]] = list(each_tuple[1])
        
        >>> d1
        {'1': ['a', 'A'], '3': ['c', 'C'], '2': ['b', 'B']}
        

        【讨论】:

          【解决方案5】:

          一个超级干净和优雅的选择是执行以下操作:

          >>> d = {}
          >>> for k,v in (('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C')):
          ...     d.setdefault(k, []).append(v)
          ... 
          >>> d
          {'1': ['a', 'A'], '3': ['c', 'C'], '2': ['b', 'B']}
          

          【讨论】:

          • 请注意,他们需要元组,而不是列表。
          【解决方案6】:

          为了完整起见,您可以使用列表推导的副作用在一行中执行此操作:

          >>> tups=t=(('1','a'), ('1','A'), ('2','b'), ('2','B'), ('3','c'),('3', 'C'))
          >>> d={}
          >>> [d.setdefault(k,[]).append(v) for k,v in tups]
          [None, None, None, None, None, None]
          >>> d
          {'1': ['a', 'A'], '3': ['c', 'C'], '2': ['b', 'B']}
          

          或集合理解的副作用(Py 2.7+ 或 3.1+):

          >>> d={}
          >>> {d.setdefault(k,[]).append(v) for k,v in tups}
          set([None])
          >>> d
          {'1': ['a', 'A'], '3': ['c', 'C'], '2': ['b', 'B']}
          

          这更多是出于兴趣——不推荐语法——但仍然很有趣。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-03-10
            • 1970-01-01
            相关资源
            最近更新 更多