#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})