興味深いことに、最初に壁のタイプごとに分割して、これを実行できるようにする必要があります。
>>> from itertools import groupby
>>> wallList = ['wall_l0', 'wall_l1', 'wall_broken_l0', 'wall_broken_l1',
'wall_vwh_l0','wall_vwh_l1', 'wall_vwh_broken_l0',
'wall_vwh_broken_l1', 'wall_vpi_l0', 'wall_vpi_l1',
'wall_vpi_broken_l0', 'wall_vpi_broken_l1']
>>> list(groupby(sorted(wallList), lambda wall: wall.replace('_broken', '')[:-3]))
[('wall', <itertools._grouper object at 0x1004edc50>), ('wall_vpi', <itertools._grouper object at 0x1004edb90>), ('wall_vwh', <itertools._grouper object at 0x1004eda90>)]
タイプが壊れているタイプで分離できるようになったので、すばらしいです。
これはすべてが一緒にどのように見えるかです。
>>> from itertools import groupby
>>> wallList = ['wall_l0', 'wall_l1', 'wall_broken_l0', 'wall_broken_l1',
'wall_vwh_l0','wall_vwh_l1', 'wall_vwh_broken_l0',
'wall_vwh_broken_l1', 'wall_vpi_l0', 'wall_vpi_l1',
'wall_vpi_broken_l0', 'wall_vpi_broken_l1']
>>> values = [[list(v) for k, v in groupby(values, lambda value: '_broken_' in value)]
... for key, values in groupby(sorted(wallList), lambda wall: wall.replace('_broken', '')[:-3])]
>>> from pprint import pprint
>>> pprint(values)
[[['wall_broken_l0', 'wall_broken_l1'], ['wall_l0', 'wall_l1']],
[['wall_vpi_broken_l0', 'wall_vpi_broken_l1'],
['wall_vpi_l0', 'wall_vpi_l1']],
[['wall_vwh_broken_l0', 'wall_vwh_broken_l1'],
['wall_vwh_l0', 'wall_vwh_l1']]]
確かに他の方法もありますが、これは簡潔なようです。
別の方法は次のとおりです。
>>> from collections import defaultdict
>>> values = defaultdict(lambda : defaultdict(list))
>>> for wall in wallList:
... if 'broken' in wall:
... values[wall[:-3].replace('_broken', '')]['broken'].append(wall)
... else:
... values[wall[:-3]]['default'].append(wall)
...
>>> values.items()
[('wall', defaultdict(<type 'list'>, {'default': ['wall_l0', 'wall_l1'], 'broken': ['wall_broken_l0', 'wall_broken_l1']})), ('wall_vpi', defaultdict(<type 'list'>, {'default': ['wall_vpi_l0', 'wall_vpi_l1'], 'broken': ['wall_vpi_broken_l0', 'wall_vpi_broken_l1']})), ('wall_vwh', defaultdict(<type 'list'>, {'default': ['wall_vwh_l0', 'wall_vwh_l1'], 'broken': ['wall_vwh_broken_l0', 'wall_vwh_broken_l1']}))]
>>>
この2番目の方法は、1回だけ反復し、辞書の検索は一定であり、名前と状態で任意の壁のセットにアクセスできるため、より高速になるはずです...
>>> values['wall']['default']
['wall_l0', 'wall_l1']
>>> values['wall_vpi']['default']
['wall_vpi_l0', 'wall_vpi_l1']
>>> values['wall_vpi']['broken']
['wall_vpi_broken_l0', 'wall_vpi_broken_l1']
>>>