У меня возникают трудности с созданием цикла, который подсчитывает количество вхождений слова в массиве, а при циклическом прохождении указанного массива создает другой цикл с текущим счетчиком вхождений слова. Я могу получить общее количество вхождений отдельных слов, используя счетчик коллекций (), но мне не обязательно знать общее количество, которое мне нужно, оно увеличивается.
Я попытался использовать словарь, созданный с помощью counter (), и вернуться к этому массиву, но в результате создается массив, который выполняет половину работы, но порядок исходного вывода пропал.
ПЕТЛЯ
for key, value in cnt.most_common():
x = value
y = 0
for index, word in enumerate(reversed(outputList)):
if key == word:
if x > 0:
outputFontSizeList.append(word + str(x-y))
if y <= x:
y += 1
else:
y = 0
ВЫХОД
[5,4,3,2,1,3,2,1,4,3,2,1,1,1]
Желаемый результат подробно описан ниже, если бы у меня был список вроде
['cat','dog','neck','book','neck','bottle','apple','orange','cat','dog','cat','apple','neck','cat','dog']
Я бы после цикла имел массив, в котором были бы счетчики, соответствующие текущему количеству вхождений указанного слова, соответствующего другому массиву
[1,1,1,1,2,1,1,1,2,2,3,2,3,4,3]
@DyZ Изначально я пытался использовать индекс и применить его, но похоже, что весь мой подход был неправильным.
Не нужно добавлять к заголовку слово «Решено». Когда вы выберете лучший ответ, система пометит вопрос как ответ и покажет его зеленым цветом (на большинстве платформ). Я снял этикетку.






def get_occurences( input ):
output = []
occurences_dict = {}
for word in input:
if word in occurences_dict:
occurences_dict[ word ] += 1
else:
occurences_dict[ word ] = 1
output.append( occurences_dict[ word ] )
return output
Работает с:
input = [
"cat",
"dog",
"neck",
"book",
"neck",
"bottle",
"apple",
"orange",
"cat",
"dog",
"cat",
"apple",
"neck",
"cat",
"dog"
]
print( get_occurences( input ) )
Дает
[1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 3, 2, 3, 4, 3]
По сути, используйте словарь, чтобы вести текущий счетчик каждого встречающегося слова и добавлять его в выходной массив. Если вам нужно общее количество каждого слова, верните также использованный словарь.
Я бы рекомендовал просто считать по мере прохождения, а не использовать collections.Counter. Однако использование collections.defaultdict(int) может быть полезным:
import collections
arr = ['cat','dog','neck','book','neck','bottle','apple','orange','cat','dog','cat','apple','neck','cat','dog']
c = collections.defaultdict(int)
output = []
for word in arr:
c[word] += 1
output.append(c[word])
print(output)
Большое вам спасибо, я действительно ломал голову над тем, как это сделать, но на самом деле это гораздо более простое решение, которое я подумал ...
Обновил мой ответ
class my_cnt:
def __init__(self):
self.data = dict()
def count(self, val):
if not val in self.data.keys():
self.data.update({val : 1})
else:
self.data[val] = self.data[val] + 1
return self.data[val]
lst = ['cat','dog','neck','book','neck','bottle','apple','orange','cat','dog','cat','apple','neck','cat','dog']
cnt = my_cnt()
output = [cnt.count(e) for e in lst]
print(output)
На самом деле ОП не пытается этого добиться. Его желаемый результат - это количество появлений до этого момента.
Вы можете сделать это довольно легко с помощью Pandas:
import pandas as pd
l = ['cat','dog','neck','book','neck','bottle','apple','orange','cat','dog','cat','apple','neck','cat','dog']
s = pd.Series(l)
s.groupby(s).cumcount().add(1).tolist()
Выход:
[1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 3, 2, 3, 4, 3]
Вы не используете
index, почему вы звонитеenumerate?