itertools
andを使用してみることができますgroupby
(詳細については、こちらを参照してください)。その目的は、key
「グループ化」するために使用する値を提供することです (適切にグループ化するには、アイテムを並べ替える必要があるため、ピースが必要であることにfile_list
注意してください)。 sorted
:
In [1]: from itertools import groupby
In [2]: file_list = [ 'drug.resp1.17A.tag', 'drug.resp1.96A.tag', 'drug.resp1.56B.tag', 'drug.resp2.17A.tag', 'drug.resp2.56B.tag', 'drug.resp2.96A.tag']
In [3]: drug_list = [ '17A', '96A', '56B']
In [4]: grouper = lambda x: x.split('.')[-2]
In [5]: d = {}
In [6]: for key, group in groupby(sorted(file_list, key=grouper), key=grouper):
...: d[key] = list(group)
...:
...:
In [7]: d
Out[7]:
{'17A': ['drug.resp1.17A.tag', 'drug.resp2.17A.tag'],
'56B': ['drug.resp1.56B.tag', 'drug.resp2.56B.tag'],
'96A': ['drug.resp1.96A.tag', 'drug.resp2.96A.tag']}
これが行うことは、分割後に最後から 2 番目の要素で各アイテムをfile_list
グループ化し、結果のグループをその場所で見つかったキーに割り当てることです。部分は、少しスペースを節約することです。grouper
リストを特別なキーで並べ替えてから、関数を使用して同じキーでグループ化するlambda
ため、その関数を別の変数に保存して、groupby
句が少し読みやすくなるようにします。 .
drug_list
注意すべきことの 1 つは、これはあなたにとって重要である場合とそうでない場合があるあなたの に依存しないということです。たとえば、これは次のようなものdrug.resp1.1000A.tag
を1000A
group にグループ化します。
@JFSebastian で述べられているようにdrug_list
、リストを に変換することで、自分で見つかった薬のみを効率的に含めることができますset
。これには、一意のアイテムのみが含まれ、O(1) ルックアップを持つという利点があります (つまり、if a in b
検索する必要がないことを意味します)。リストの場合と同様に、オブジェクト全体):
In [10]: drug_list = set(drug_list)
In [11]: only_listed = (f for f in file_list if grouper(f) in drug_list)
In [12]: only_listed
Out[12]: <generator object <genexpr> at 0x24fcbe0>
In [13]: for key, group in groupby(sorted(only_listed, key=grouper), key=grouper):
....: d[key] = list(group)
....:
....:
In [14]: d
Out[14]:
{'17A': ['drug.resp1.17A.tag', 'drug.resp2.17A.tag'],
'56B': ['drug.resp1.56B.tag', 'drug.resp2.56B.tag'],
'96A': ['drug.resp1.96A.tag', 'drug.resp2.96A.tag']}