如何查找重复值并将其合并? -蟒蛇

时间:2018-10-12 08:50:25

标签: python list merge duplicates nested-lists

因此基本上,例如您的列表如下:

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([])

但是不起作用,如果起作用了,那将是无效的

7 个答案:

答案 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)

使用collections.Counter

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)

这是通过functionalitertools.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)