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

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']
于 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

dict.setdefaultの代わりにを使用した@BurhanKhalidのソリューションへの別のアプローチを次に示し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 に答える