按单词长度对列表进行分组

5
例如,我有一个列表,比如说:

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

我想按单词长度分组此列表,例如
newlist = [['sight', 'first'],['love'], ['was'], ['at', 'It']]

请帮我解决这个问题。感谢您的帮助!

3个回答

11

使用 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.defaultdict(O(N)) 或先对列表进行排序,然后使用 itertools.groupby(O(NlogN))。

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

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


3
[插入有关排序和“ groupby”连续性的标准免责声明...] - DSM

6
您可以使用临时字典,然后按长度排序:
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:
from collections import defaultdict
d=defaultdict(list)
for word in li:
    d[len(word)].append(word)

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

或者像这样使用__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

你们真是太热心了!由于Canopy不能进行分组解决方案(我不知道为什么),我将采用这个解决方案! - Light

2

由于已经有了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']]

你被我领先了5秒钟;-) - dawg
@drewk, :-) :-),不过有一点小问题,我的解决方案使用了defaultdict,所以与你的略有不同。 - iruvar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接