list1=['hello','hope','hate','hack','bit','basket','code','come','chess']
我需要的是:
list2=[['hello','hope','hate','hack'],['bit','basket'],['code','come','chess']]
如果第一个字符相同并且是同一个组,则将其子列表。
我该如何解决这个问题?
答案 0 :(得分:13)
您可以使用itertools.groupby
:
>>> from itertools import groupby
>>> list1 = ['hello','hope','hate','hack','bit','basket','code','come','chess']
>>> [list(g) for k, g in groupby(list1, key=lambda x: x[0])]
[['hello', 'hope', 'hate', 'hack'], ['bit', 'basket'], ['code', 'come', 'chess']]
答案 1 :(得分:1)
扩展TerryA的答案:
要创建一个第一个字母为关键字且匹配元素为值的字典,您可以
>>> list1=['hello','hope','hate','hack','bit','basket','code','come','chess', 'archetype', 'cheese']
... mydict={}
... for k, g in groupby(list1, key=lambda x: x[0]):
... if k in mydict:
... mydict[k] += g
... else:
... mydict[k]=list(g)
... print(mydict)
{'h': ['hello', 'hope', 'hate', 'hack'], 'b': ['bit', 'basket'], 'a': ['archetype'], 'c': ['code', 'come', 'chess', 'cheese']}
如果list1没有排序(如图所示),这也有效,当然,它也可以再次转换为列表列表
>>> [v for k, v in mydict.items()]
[['hello', 'hope', 'hate', 'hack'], ['bit', 'basket'], ['archetype'], ['code', 'come', 'chess', 'cheese']]
答案 2 :(得分:0)
您可以使用partition_by库中的funcy函数执行此操作:
from funcy import partition_by
list2 = partition_by(0, list1)
请注意,仅当list1
已经排序时才会有效,与itertools.groupby
一样。如果list1
未排序而不是排序,然后分区效率低下,更好的方法是使用group_by函数:
from funcy import group_by
list2 = group_by(0, list1).values()
答案 3 :(得分:0)
在Python 3.7+中(即字典保持插入顺序的版本),您可以简单地使用以第一个字符为键的列表字典来对单词进行分组。这适用于已排序和未排序的输入:
list1 = ['hello', 'hope', 'hate', 'bit', 'basket', 'code', 'come', 'chess', 'hack']
d = {}
for word in list1:
d.setdefault(word[0], []).append(word)
list2 = list(d.values())
print(list2)
# [['hello', 'hope', 'hate', 'hack'], ['bit', 'basket'], ['code', 'come', 'chess']]