разделяйте и подсчитывайте смайлики в списке python

#python #list #count #emoji

#python #Список #подсчитывайте #эмодзи

Вопрос:

Я хочу подсчитать количество вхождений смайликов в список в python.

Предполагая, что мой список выглядит следующим образом
li = [‘😁’, ‘🤣😁’, ‘😁🤣😋’]

Счетчик (li) выдал бы мне {‘😁’: 1, ‘🤣😁’: 1, ‘😁🤣😋’: 1}

Но я хотел бы получить общее количество смайликов, иначе {‘😁’: 3, ‘🤣’: 2, ‘😋’: 1}

Моя главная проблема заключается в том, как разделить большие куски непрерывных смайликов на отдельные записи списка. Я попытался заменить начало » U» на » U», чтобы затем я мог просто разделить на » «, но, похоже, это не сработало.

Заранее спасибо за вашу помощь 🙂

Ответ №1:

Вы можете свести свой список в одну строку, используя join , а затем применить Counter к этому:

 Counter("".join(li))
  

результаты в

 Counter({'😁': 3, '🤣': 2, '😋': 1})
  

или, может быть, более эффективный способ использования памяти — это

 counter = Counter()
for item in li:
    counter.update(item)
  

Ответ №2:

Вы можете подсчитать смайлики, повторяя символы каждой строки:

 from collections import Counter

li = ['😁', '🤣😁', '😁🤣😋']

count = Counter(emoji for string in li for emoji in string)

print(count)
# Counter({'😁': 3, '🤣': 2, '😋': 1})
  

@Dan дал другой ответ непосредственно передо мной, который он, к сожалению, удалил с тех пор, поэтому я воспроизвожу его для <10 тыс. пользователей, которые не могут его видеть:

 Counter("".join(li))
  

Я думал, что это может быть менее эффективно из-за создания объединенной строки, но я сделал несколько таймингов с маленькими и большими списками до 10 000 000 элементов, и кажется, что его решение стабильно работает на 30-40% быстрее.

Комментарии:

1. О, я очень удивлен, что это быстрее. Я восстановлю удаление. Хотя я не могу представить, почему это было бы лучше. Ваш выглядит как один линейный проход через элементы списка, мой выглядит как 2 прохода, хотя это :/ может быть, это позволяет хеш-таблице счетчика заранее назначить больший объем пространства?

2. @Dan Я тоже не уверен… Я попытаюсь взглянуть на это позже.

Ответ №3:

Еще один способ — использовать тот факт, что счетчики реализуют сложение:

 >>> li = ['😁', '🤣😁', '😁🤣😋']
>>> from collections import Counter
>>> sum(map(Counter, li), Counter())
Counter({'😁': 3, '🤣': 2, '😋': 1})