Получить добавочный счетчик списка для всех элементов - PullRequest
1 голос
/ 12 января 2020

У меня есть список с 24 миллионами элементов, и я хочу увеличивать счетчик каждого элемента итеративно и быстрее сохранять счет в другом списке. Например, мой список:

a=['bike','bike','jeep','horse','horse','horse','flight','flight','cycle']

Мой ожидаемый результат:

[1, 2, 1, 1, 2, 3, 1, 2, 1]

Код, который я использовал,

z=[]
for i in a:
   z.append(a.count(i))

Но мой вывод немного отличается

[2, 2, 1, 3, 3, 3, 2, 2, 1]

Мой порядок в этом вновь созданном списке также важен и должен основываться на моем списке (а). Любая помощь очень ценится.

Ответы [ 4 ]

3 голосов
/ 12 января 2020

Исходя из вашего ожидаемого результата, так как вам нужно количество элементов до того индекса списка, по которому вы итерируете в тот момент времени, следующий код должен работать:

from collections import defaultdict

a=['bike','bike','jeep','horse','horse','horse','flight','flight','cycle']

a_dict = defaultdict(int)
a_output = []

for x in a:
    a_dict[x] += 1
    a_output.append(a_dict[x])

print(a_output)

Вывод:

[1, 2, 1, 1, 2, 3, 1, 2, 1]
1 голос
/ 12 января 2020

Вот одно решение -


a=['bike','bike','jeep','horse','horse','horse','flight','flight','cycle']
countArr = []
temp = {}
for i in a:
    if i in temp:
        temp[i]+=1
        countArr.append(temp.get(i))
    else:
        temp[i] = 1
        countArr.append(temp.get(i))

0 голосов
/ 12 января 2020

вы можете использовать подсчет массива:

a=['bike','bike','jeep','horse','horse','horse','flight','flight','cycle']

z=[]

i = 0
while i < len(a):
    #print(a[0:i])
    #print(a[i])
    z.append(a[0:i].count(a[i]) + 1)
    i+= 1

print(z)
0 голосов
/ 12 января 2020

Вы можете использовать словарь и for l oop, чтобы выполнить sh this:

counts = {}
a = ['bike','bike','jeep','horse','horse','horse','flight','flight','cycle']
z = []
for i in a:
    if i in counts:
        counts[i] += 1
    else:
        counts[i] = 1
    z.append(counts[i])

print(z)
# [1, 2, 1, 1, 2, 3, 1, 2, 1]

Вы также можете сделать эту забавную хакерскую вещь с пониманием списка, которое использует оценку порядок кортежей и делает по существу то же самое, что и выше for l oop, но сведены в одну строку:

counts = {}
z = [(counts.__setitem__(i, counts[i] + 1 if i in counts else 1), counts[i])[1] for i in a]
print(z)
# [1, 2, 1, 1, 2, 3, 1, 2, 1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...