2012-06-29 27 views
1

我是python的新手,我需要一些指導。遍歷下面列表的最佳方式是什麼?如何在Python列表中實現數據搜索

[('admincases', 'test_case_6'), ('admincases', 'test_case_8'),('admincases1', 'test_case_8'),('admincases1', 'test_case_9'),('admincases1', 'test_case_10')] 

首先,我想所有的admincases獨特的價值,如:

['admincases', 'admincases1'] 

然後通過上面的案例迭代我應該得到測試的列表中指定的情況下:

'admincase' 
    ['test_case_6', 'test_case_8'] 
'admincase1' 
    ['test_case_8', 'test_case_9', 'test_case_10'] 

回答

3

使用defaultdict

>>> from collections import defaultdict 
>>> d = defaultdict(list) 
>>> l = [('admincases', 'test_case_6'), ('admincases', 'test_case_8'),('admincases1', 'test_case_8'),('admincases1', 'test_case_9'),('admincases1', 'test_case_10')] 
>>> for k,v in l: 
... d[k].append(v) 
... 
>>> d['admincases'] 
['test_case_6', 'test_case_8'] 
1
>>> lis= [('admincases', 'test_case_6'), ('admincases', 'test_case_8'),('admincases1', 'test_case_8'),('admincases1', 'test_case_9'),('admincases1', 'test_case_10')] 

>>> lis1=list({x[0] for x in lis}) #returns ['admincases', 'admincases1'] 

>>> dic={y:[x[1] for x in lis if x[0]==y]for y in lis1} 
>>> dic 
{'admincases': ['test_case_6', 'test_case_8'], 'admincases1': ['test_case_8', 'test_case_9', 'test_case_10']} 
2
>>> itertools.groupby(L, key=operator.itemgetter(0)) 
<itertools.groupby object at 0x7fb79740aa48> 
>>> list(itertools.groupby(L, key=operator.itemgetter(0))) 
[('admincases', <itertools._grouper object at 0x7fb797405a10>), ('admincases1', <itertools._grouper object at 0x7fb797405a50>)] 
>>> [(x[0], list(x[1])) for x in itertools.groupby(L, key=operator.itemgetter(0))] 
[('admincases', [('admincases', 'test_case_6'), ('admincases', 'test_case_8')]), ('admincases1', [('admincases1', 'test_case_8'), ('admincases1', 'test_case_9'), ('admincases1', 'test_case_10')])] 

確保您的輸入是排序d首先是關鍵。

0

下面是使用的dict.setdefault代替defaultdict另一種方法來@ BurhanKhalid的解決方案。我更喜歡defaultdict,但顯然如果默認值不需要很長時間構造,速度會更快。

>>> L = [('admincases', 'test_case_6'), ('admincases', 'test_case_8'),('admincases1', 'test_case_8'),('admincases1', 'test_case_9'),('admincases1', 'test_case_10')] 
>>> D = {} 
>>> for k,v in L: 
     D.setdefault(k,[]).append(v) 


>>> D['admincases'] 
['test_case_6', 'test_case_8']