python list by first first

时间:2013-07-26 08:06:14

标签: python itertools divide

list1=['hello','hope','hate','hack','bit','basket','code','come','chess']

我需要的是:

list2=[['hello','hope','hate','hack'],['bit','basket'],['code','come','chess']]

如果第一个字符相同并且是同一个组,则将其子列表。

我该如何解决这个问题?

4 个答案:

答案 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']]