Python:将列表排序为多个列表或字典

Python:将列表排序为多个列表或字典,python,list,sorting,dictionary,Python,List,Sorting,Dictionary,我有一个字符串列表,下面是一个示例: 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_

我有一个字符串列表,下面是一个示例:

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']
我想按墙类型和状态(默认/断开)将它们分组:


有人知道如何最好地做到这一点,或者知道python的配方吗?

在字符串上拆分:
string.Split(“')
)。如果你得到2个场,你就得到了退化情况。如果得到3,则按中间区域3分组。一本列表字典可能会有所帮助,或者最好是一本collections.defaultdict(列表)。

这里有一个小的行程序:

import itertools, re
results = [list(v) for (k, v) in itertools.groupby(sorted(wallList),
        lambda x: re.sub(r'\d+', '0', x))]
这并不能保持顺序,但在其他方面,它会得到与您想要的相同的输出


它的工作原理是查看所有数字都转换为“0”的版本,并对重复项进行分组。

编辑:显然,我的答案只有部分正确,因为我忘了按“状态”进行组织。正确答案来自@samy.vilar

使用:


有趣的是,首先我们需要按墙的类型来划分它,这样我们就可以这样做了

>>> 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 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']}))]
>>>

这并不能真正回答问题。啊,是的,我忘了它也需要按州组织。这其实是正确的答案+1.
>>> 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']
>>>