Как найти повторяющиеся значения и объединить их?- питон - PullRequest
0 голосов
/ 12 октября 2018

Так, например, у вас, например, есть список, такой как:

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 голосов
/ 12 октября 2018

Другой подход заключается в использовании метода 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']]
0 голосов
/ 12 октября 2018
l = ['a','b','a','b','c','c']

want = []
for i in set(l):
    want.append(list(filter(lambda x: x == i, l)))
print(want)    
0 голосов
/ 12 октября 2018

Наверное, не самый эффективный, но это понятно:

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])
0 голосов
/ 12 октября 2018

Вот функциональное решение через 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))))
0 голосов
/ 12 октября 2018

Использование 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']]
0 голосов
/ 12 октября 2018

Вы можете использовать collections.Counter:

from collections import Counter
[[k] * c for k, c in Counter(l).items()]

Возвращает:

[['a', 'a'], ['b', 'b'], ['c', 'c']]
0 голосов
/ 12 октября 2018

Сортируйте список, затем используйте 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) времени сложность для среднего случая и не требуется для всехрешения (см. комментарии)

...