有趣的是,首先我们需要按墙类型将其分解,这样我们才能做到这一点。
>>> 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']}))]
>>>
第二种方法应该更快,因为我们只迭代一次,字典查找是恒定的,我们可以通过名称和状态访问任何一组墙...
>>> 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']
>>>