Python - подсчитывает вхождения элемента как один цикл по несортированному массиву

У меня возникают трудности с созданием цикла, который подсчитывает количество вхождений слова в массиве, а при циклическом прохождении указанного массива создает другой цикл с текущим счетчиком вхождений слова. Я могу получить общее количество вхождений отдельных слов, используя счетчик коллекций (), но мне не обязательно знать общее количество, которое мне нужно, оно увеличивается.

Я попытался использовать словарь, созданный с помощью 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] 

Вы не используете index, почему вы звоните enumerate?

DYZ 24.03.2018 04:40

@DyZ Изначально я пытался использовать индекс и применить его, но похоже, что весь мой подход был неправильным.

Dave 24.03.2018 05:06

Не нужно добавлять к заголовку слово «Решено». Когда вы выберете лучший ответ, система пометит вопрос как ответ и покажет его зеленым цветом (на большинстве платформ). Я снял этикетку.

Klaus D. 24.03.2018 05:32
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
1 285
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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)

Большое вам спасибо, я действительно ломал голову над тем, как это сделать, но на самом деле это гораздо более простое решение, которое я подумал ...

Dave 24.03.2018 05:02

Обновил мой ответ

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)

На самом деле ОП не пытается этого добиться. Его желаемый результат - это количество появлений до этого момента.

David A 24.03.2018 04:54

Вы можете сделать это довольно легко с помощью 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]

Другие вопросы по теме