按字长将列表分组

2024-05-23 18:51:15 发布

您现在位置:Python中文网/ 问答频道 /正文

例如,我有一个清单,比如说

list = ['sight', 'first', 'love', 'was', 'at', 'It']

我想把这个单子按字长分组

^{pr2}$

请帮我一下。 欣赏!在


Tags: itatlist单子firstwassightlove
3条回答

您可以使用临时字典,然后按长度排序:

li=['sight', 'first', 'love', 'was', 'at', 'It']

d={}
for word in li:
    d.setdefault(len(word), []).append(word)

result=[d[n] for n in sorted(d, reverse=True)] 

print result  
# [['sight', 'first'], ['love'], ['was'], ['at', 'It']]

您可以使用defaultdict:

^{pr2}$

或者使用__missing__,如下所示:

class Dicto(dict):
    def __missing__(self, key):
        self[key]=[]
        return self[key]

d=Dicto()
for word in li:
    d[len(word)].append(word)

result=[d[n] for n in sorted(d, reverse=True)] 
print result

因为groupby溶液已经被采用;-)

from collections import defaultdict
lt = ['sight', 'first', 'love', 'was', 'at', 'It']                       
d = defaultdict(list)
for x in lt:
  d[len(x)].append(x)
d.values()
[['at', 'It'], ['was'], ['love'], ['sight', 'first']]

使用itertools.groupby

>>> from itertools import groupby
>>> lis = ['sight', 'first', 'love', 'was', 'at', 'It']
>>> [list(g) for k, g in groupby(lis, key=len)]
[['sight', 'first'], ['love'], ['was'], ['at', 'It']]

请注意,要使itertools.groupby正常工作,所有项目必须按长度排序,否则使用collections.defaultdictO(N))或先对列表排序,然后使用itertools.groupbyO(NlogN))。公司名称:

^{pr2}$

如果希望最终输出列表也被排序,那么最好按长度对列表项进行排序,并对其应用itertools.groupby。在

相关问题 更多 >