Как сгруппировать элементы в списке? - PullRequest
0 голосов
/ 05 июня 2018

У меня есть список python:

['AM43',
 'AM22',
 'AM51',
 'AM43',
 'AM22',
 'AM51',
 'AM43',
 'AM22',
 'AM51']

Я хочу, чтобы вывод был списком:

['AM43',
 'AM43',
 'AM43',
 'AM22',
 'AM22',
 'AM22',
 'AM51',
 'AM51',
 'AM51']

Я пробовал sort(), но это также переставляет порядок.Я не хочу этогоЯ хочу, чтобы выходные данные были в том же порядке, что и список ввода.

Ответы [ 4 ]

0 голосов
/ 05 июня 2018

Вот решение с использованием collections.Counter, itertools и toolz.unique.Обратите внимание, что последний использует стороннюю библиотеку, но исходный код - это просто itertools unique_everseen recipe .

from collections import Counter
from itertools import repeat, chain
from toolz import unique

lst = ['AM43', 'AM22', 'AM51', 'AM43', 'AM22',
       'AM51', 'AM43', 'AM22', 'AM51']

c = Counter(lst)
uniques = unique(lst)

res = list(chain.from_iterable(repeat(u, c[u]) for u in uniques))

res

['AM43', 'AM43', 'AM43',
 'AM22', 'AM22', 'AM22',
 'AM51', 'AM51', 'AM51']
0 голосов
/ 05 июня 2018

Вы можете создать список для каждого уникального номера, а затем просто объединить их на основе исходного порядка ввода.

0 голосов
/ 05 июня 2018

Следуя ответу Якима Пироженко, для получения соответствующего ордера необходимо пересчитать lst при построении индекса dict:

lst = ["AM43", "AM22", "AM51", "AM43", "AM22", "AM51", "AM43", "AM22", "AM43"]

ix = {k: i for i, k in zip(range(len(lst), -1, -1), reversed(lst))}

res = sorted(lst, key=ix.get)
0 голосов
/ 05 июня 2018

Вы можете создать dict, в котором будет храниться индекс первого вхождения каждого значения, и использовать dict для выполнения сортировки:

lst = ["AM43", "AM22", "AM51", "AM43", "AM22", "AM51", "AM43", "AM22", "AM51"]

ix = {k: i for i, k in reversed(list(enumerate(lst)))}
res = sorted(lst, key=ix.get)
# ['AM51', 'AM51', 'AM51', 'AM22', 'AM22', 'AM22', 'AM43', 'AM43', 'AM43']

Edit: @ emsimposon92 обеспечивает двухпроходное линейное времяРешение реализуемо следующим образом:

from collections import Counter

ctr = Counter(lst)
visited = set()
res2 = list()
for x in lst:
    if x in visited:
        continue
    res2.extend([x] * ctr[x])
    visited.add(x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...