【问题标题】:List duplicate data concatenation in python在python中列出重复的数据连接
【发布时间】:2012-10-24 12:10:19
【问题描述】:

我是 python 的新手,在获取此输出时遇到问题

 a = [('textVerify', 'AH', 'SELECT SERVICES'), ('textVerify', 'F7', 'test1>'),('audioVerify', '091;0'), ('imageVerify', 'duck.gif'),('imageVerify', 'egg.gif')]

我想创建一个新列表,该列表应包含所有第 0 个唯一元素,例如

  audioVerify,imageVerify,textVerify

所以预期的结果是

 ['textVerify',(('AH', 'SELECT SERVICES'), ('F7', 'test1>'))  'audioVerify', ('091;0'),  ('imageVerify', ('duck.gif','egg.gif')]

【问题讨论】:

  • 这不是一个合适的数据结构。字典会更有意义,尤其是 defaultdict。

标签: python list python-2.7


【解决方案1】:

您最好为此使用defaultdict

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> for item in a:
...     d[item[0]].append(item[1:])
...
>>> d
defaultdict(<class 'list'>, {'textVerify': [('AH', 'SELECT SERVICES'), 
('F7', 'est1>')], 'imageVerify': [('duck.gif',), ('egg.gif',)], 
'audioVerify': [('091;0',)]})

现在您可以通过名称/索引访问其元素:

>>> d['textVerify']
[('AH', 'SELECT SERVICES'), ('F7', 'test1>')]
>>> d['textVerify'][0][0]
'AH'

如果您需要保留字典键的顺序,可以使用 OrderedDict.setdefault() 方法,如 Ashwini Chaudhary 所述:

>>> d = OrderedDict()
>>> for x in a:
...     d.setdefault(x[0],[]).append(x[1:])
...
>>> d
OrderedDict([('textVerify', [('AH', 'SELECT SERVICES'), ('F7', 'test1>')]), 
('audioVerify', [('091;0',)]), ('imageVerify', [('duck.gif',), ('egg.gif',)])])

【讨论】:

  • 虽然dict.setdefault()defauldict() 快一点。
  • 关于如何使用这个来保存字典条目的顺序:
  • @Ragav:如果订单相关,您可以使用OrderedDict。我已经编辑了我的答案。
  • @TimPietzcker : 也一样 :)
【解决方案2】:

使用dict.setdefault(),这比defaultdict() 稍微快一点,至少对于小列表来说。:

>>> a
[('textVerify', 'AH', 'SELECT SERVICES'), ('textVerify', 'F7', 'test1>'), ('audioVerify', '091;0'), ('imageVerify', 'duck.gif'), ('imageVerify', 'egg.gif')]
>>> d={}
>>> for x in a:
...     d.setdefault(x[0],[]).append(x[1:])
... 
>>> d
{'audioVerify': [('091;0',)], 'textVerify': [('AH', 'SELECT SERVICES'), ('F7', 'test1>')], 'imageVerify': [('duck.gif',), ('egg.gif',)]}

>>> d["audioVerify"]
[('091;0',)]

【讨论】:

    【解决方案3】:
    >>> from collections import defaultdict
    >>> d = defaultdict(list)
    >>> _ = [d[i[0]].append(i[1:]) for i in a]
    >>> d['textVerify']
    [('AH', 'SELECT SERVICES'), ('F7', 'test1>')]
    

    【讨论】:

      【解决方案4】:
      a = [('textVerify', 'AH', 'SELECT SERVICES'), ('textVerify', 'F7', 'test1>'),('audioVerify', '091;0'), ('imageVerify', 'duck.gif'),('imageVerify', 'egg.gif')]
      
      c=set(i[0] for i in a)
      d=dict()
      for i in c:
              m=[]
              for v in a:
                      if v[0]==i:
                              m.extend(list(v[1:]))
              if len(m) !=0:
                      d[i]=m
      
      print(d)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-24
        • 2012-10-03
        • 2017-08-02
        • 1970-01-01
        • 2020-05-29
        • 2015-09-24
        • 2021-09-02
        • 2013-06-13
        相关资源
        最近更新 更多