Python - сделать неуникальные элементы в списке уникальными, добавив счетчик - PullRequest
1 голос
/ 24 марта 2020

Как мне сделать элементы в моем списке уникальными, объединяя счет, начиная с 1 для каждого уникального значения?

, например,

sheep, sheep, tiger, sheep, hippo, tiger

становится:

sheep1, sheep2, tiger1, sheep3, hippo1, tiger2

Ответы [ 4 ]

1 голос
/ 24 марта 2020

Вот как вы можете использовать Counter для этого.

from collections import Counter

s = ["sheep", "sheep", "tiger", "sheep", "hippo", "tiger"]
u = [ f"{a}{c[a]}" for c in [Counter()] for a in s if [c.update([a])] ]

print(u)

['sheep1', 'sheep2', 'tiger1', 'sheep3', 'hippo1', 'tiger2']

обратите внимание, что если ваши строки могут иметь суффикс цифра c, этого будет недостаточно для охвата всех случаев ( например, ['alpha']*11+['alpha1'] будет повторяться 'alpha11')

0 голосов
/ 10 апреля 2020

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

['sheep', 'sheep1', 'tiger', 'sheep2', 'hippo', 'tiger1']

Я подошел к нему немного по-другому, ища решение O (n), и расширил класс словаря.

class IncDict(dict):
    def __missing__(self,key):
        return -1

    def __getitem__(self,key):
        val = dict.__getitem__(self,key)
        val+=1
        dict.__setitem__(self,key,val)
        if val==0:
            return key
        else:
            return key+str(val)

l = ['sheep', 'sheep', 'tiger', 'sheep', 'hippo', 'tiger']
uniquify = IncDict()
[uniquify[x] for x in l]

Вывод:

['sheep', 'sheep1', 'tiger', 'sheep2', 'hippo', 'tiger1']
0 голосов
/ 24 марта 2020

Использование комбинации defaultdict и count:

>>> from collections import defaultdict
>>> from itertools import count
>>> s = ["sheep", "sheep", "tiger", "sheep", "hippo", "tiger"]
>>> d = defaultdict(lambda: count(1))
>>> [f'{x}{next(d[x])}' for x in s]
['sheep1', 'sheep2', 'tiger1', 'sheep3', 'hippo1', 'tiger2']

count - это объект, который выдает все увеличивающиеся числа, когда вы перебираете его; вызов next дает следующий номер в последовательности.

defaultdict создает новый экземпляр count каждый раз, когда вы пытаетесь получить доступ к новому ключу, сохраняя вновь созданный экземпляр в следующий раз Вы видите тот же ключ.

0 голосов
/ 24 марта 2020

Вы можете использовать простой for l oop:

l = ['sheep', 'sheep', 'tiger', 'sheep', 'hippo', 'tiger']

count = {}
output = []
for s in l:
    if s in count:
        count[s] += 1
    else:
        count[s] = 1

    output.append(f'{s}{count[s]}')

output

выход:

['sheep1', 'sheep2', 'tiger1', 'sheep3', 'hippo1', 'tiger2']
...