2012-11-04 62 views
1

我是一个Python新手,面临的问题在得到这个输出列表中的重复数据拼接

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

我想创建应容纳所有的零独特的元素像

audioVerify,imageVerify,textVerify 
一个新的列表

所以预期结果是

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

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

回答

5

你最好使用这个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' 

如果您需要保存字典键的顺序,你可以用.setdefault()方法使用OrderedDict,在一起,通过阿什维尼乔杜里描述:

>>> 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',)])]) 
+0

+1,打败我吧。 –

+0

我也是,显然+1 –

+0

尽管'dict.setdefault()'比'defauldict()'还要快。 –

0
>>> from collections import defaultdict 
>>> d = defaultdict(list) 
>>> _ = [d[i[0]].append(i[1:]) for i in a] 
>>> d['textVerify'] 
[('AH', 'SELECT SERVICES'), ('F7', 'test1>')] 
2

dict.setdefault()使用,这是S轻轻的速度比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',)] 
0
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)