因此基本上,例如您的列表如下:
l = ['a','b','a','b','c','c']
输出应为:
[['a','a'],['b','b'],['c','c']]
因此,基本上将复制到列表中的值放在一起
我尝试过:
l = ['a','b','a','b','c','c']
it=iter(sorted(l))
next(it)
new_l=[]
for i in sorted(l):
new_l.append([])
if next(it,None)==i:
new_l[-1].append(i)
else:
new_l.append([])
但是不起作用,如果起作用了,那将是无效的
答案 0 :(得分:4)
排序列表,然后使用itertools.groupby
:
>>> from itertools import groupby
>>> l = ['a','b','a','b','c','c']
>>> [list(g) for _, g in groupby(sorted(l))]
[['a', 'a'], ['b', 'b'], ['c', 'c']]
编辑:这可能不是最快的方法,对于一般情况,排序是O(n log n)时间复杂度,并非所有解决方案都需要(见评论)
答案 1 :(得分:4)
from collections import Counter
l = ['a','b','a','b','c','c']
c = Counter(l)
print([[x] * y for x, y in c.items()])
# [['a', 'a'], ['b', 'b'], ['c', 'c']]
答案 2 :(得分:3)
您可以使用collections.Counter
:
from collections import Counter
[[k] * c for k, c in Counter(l).items()]
这将返回:
[['a', 'a'], ['b', 'b'], ['c', 'c']]
答案 3 :(得分:0)
这是通过functional的itertools.groupby
解决方案。由于需要排序,因此时间复杂度为O( n log n )。
from itertools import groupby
from operator import itemgetter
L = ['a','b','a','b','c','c']
res = list(map(list, map(itemgetter(1), groupby(sorted(L)))))
[['a', 'a'], ['b', 'b'], ['c', 'c']]
由于Python不提供本机函数组合,因此语法繁琐。第三方库toolz
支持此功能:
from toolz import compose
foo = compose(list, itemgetter(1))
res = list(map(foo, groupby(sorted(L))))
答案 4 :(得分:0)
可能不是最有效的,但这是可以理解的:
l = ['a','b','a','b','c','c']
dict = {}
for i in l:
if dict[i]:
dict[i] += 1
else:
dict[i] = 1
new = []
for key in list(dict.keys()):
new.append([key] * dict[key])
答案 5 :(得分:0)
另一种方法是使用zip
方法。
l = ['a','b','a','b','c','c','b','c', 'a']
l = sorted(l)
grouped = [list(item) for item in list(zip(*[iter(l)] * l.count(l[0])))]
输出
[['a', 'a', 'a'], ['b', 'b', 'b'], ['c', 'c', 'c']]
答案 6 :(得分:0)
l = ['a','b','a','b','c','c']
want = []
for i in set(l):
want.append(list(filter(lambda x: x == i, l)))
print(want)