如何在python列表中实现数据搜索

时间:2012-06-29 11:32:15

标签: python python-2.7

我是python的新手,我需要一些指导。迭代下面列表的最佳方法是什么。

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

首先,我希望获得所有管理员的独特价值,如:

['admincases', 'admincases1']

然后迭代上述情况我应该得到指定案例的测试列表:

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

4 个答案:

答案 0 :(得分: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 :(得分: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')])]

请确保您的输入首先按键排序。

答案 2 :(得分: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']}

答案 3 :(得分: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']