例如,我有一个列表,比如说
list = ['sight', 'first', 'love', 'was', 'at', 'It']
我想按字长对这个列表进行分组,比如说
newlist = [['sight', 'first'],['love'], ['was'], ['at', 'It']]
请帮帮我吧。 升值!
答案 0 :(得分:9)
使用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
。
答案 1 :(得分: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:
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
答案 2 :(得分:1)
由于已经采用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']]
答案 3 :(得分:0)
MyNameSpace.IContainer<int>