1

我是 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']
4

4 回答 4

3

使用默认字典

>>> 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']
于 2012-06-29T11:36:10.027 回答
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')])]

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

于 2012-06-29T11:35:52.957 回答
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']}
于 2012-06-29T11:34:09.230 回答
0

这是@BurhanKhalid 解决方案的另一种方法,使用dict.setdefault而不是defaultdict. 我更喜欢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']
于 2012-06-29T11:57:41.890 回答