我有一个表单列表:
>>> my_list = ['BLA1', 'BLA2', 'BLA3', 'ELE1', 'ELE2', 'ELE3', 'PRI1', 'PRI2', 'NEA1', 'NEA2', 'MAU1', 'MAU2', 'MAU3']
我想创建一个新列表,将重复的元素分组到我的新列表中的列表中,所以最后我会:
>>> new_list = [['BLA1', 'BLA2', 'BLA3'], ['ELE1', 'ELE2', 'ELE3'], ['PRI1', 'PRI2'], ['NEA1', 'NEA2'], ['MAU1', 'MAU2', 'MAU3']]
答案 0 :(得分:6)
import itertools
[list(group) for key, group in itertools.groupby(my_list, key=lambda v: v[:3])]
这里需要key
参数来提取您想要在上分组的值的一部分;前3个字符。
结果:
>>> my_list = ['BLA1', 'BLA2', 'BLA3', 'ELE1', 'ELE2', 'ELE3', 'PRI1', 'PRI2', 'NEA1', 'NEA2', 'MAU1', 'MAU2', 'MAU3']
>>> [list(group) for key, group in itertools.groupby(my_list, key=lambda v: v[:3])]
[['BLA1', 'BLA2', 'BLA3'], ['ELE1', 'ELE2', 'ELE3'], ['PRI1', 'PRI2'], ['NEA1', 'NEA2'], ['MAU1', 'MAU2', 'MAU3']]
groupby
将连续的等于1组的键组合在一起。如果你有不相交的组(如此相同的值,但中间有其他值),它将为这些组创建单独的组:
>>> my_list = ['a1', 'a2', 'b1', 'b2', 'a3', 'a4']
>>> [list(group) for key, group in itertools.groupby(my_list)]
[['a1', 'a2'], ['b1', 'b2'], ['a3', 'a4']]
如果这不是你想要的,你必须先排序my_list
。
答案 1 :(得分:1)
确保已排序并使用
itertools.groupy
答案 2 :(得分:1)
作为groupby的替代方案,您可以使用collections.Counter
:
In [40]: from collections import Counter
In [41]: [ [k]*v for (k,v) in Counter(my_list).iteritems() ]
Out[41]:
[['PRI', 'PRI'],
['NEA', 'NEA'],
['BLA', 'BLA', 'BLA'],
['MAU', 'MAU', 'MAU'],
['ELE', 'ELE', 'ELE']]
如果元素都混乱,这将无需对列表进行排序,与groupby不同。