Как посчитать определенные элементы строки в большом массиве?

Я не уверен, возможно ли это, но у меня есть очень большой массив, содержащий даты

a = ['Fri, 19 Aug 2011 19:28:17 -0000',....., 'Wed, 05 Feb 2012 11:00:00 -0000']

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

у ваших дат такой же формат?

Azat Ibrakov 16.09.2018 23:29

Нет, даты не обязательно должны быть в одном формате. Также мне нужны дни и месяцы.

user1821176 16.09.2018 23:34
Почему в 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
2
36
2

Ответы 2

Вы можете использовать Прилавок() из модуля коллекций.

from collections import Counter

a = ['Fri, 19 Aug 2011 19:28:17 -0000', 
     'Fri, 09 June 2017 11:11:11 -0000', 
     'Wed, 05 Feb 2012 11:00:00 -0000']

# this generator splits the dates into words, and cleans word from "".,;-:" characters:
#  ['Fri', '19', 'Aug', '2011', '19:28:17', '0000', 'Fri', '09', 'June',
#   '2017', '11:11:11', '0000', 'Wed', '05', 'Feb', '2012', '11:00:00', '0000']
# and feeds it to counting:   
c = Counter( (x.strip().strip(".,;-:") for word in a for x in word.split() ))

for key in c:
    if key.isalpha():
        print(key, c[key])

if печатает только те ключи счетчика, которые являются чистыми «буквами», а не цифрами:

Fri 2 
Aug 1
June 1
Wed 1
Feb 1

Названия дней и месяцев - единственные чистые части isalpha() ваших дат.

Полный вывод c:

Counter({'0000': 3, 'Fri': 2, '19': 1, 'Aug': 1, '2011': 1, 
         '19:28:17': 1, '09': 1, 'June': 1, '2017': 1, '11:11:11': 1, 
         'Wed': 1, '05': 1, 'Feb': 1, '2012': 1, '11:00:00': 1})

Улучшение от @AzatIbrakov комментарий:

c = Counter( (x.strip().strip(".,;-:") for word in a for x in word.split() 
              if x.strip().strip(".,;-:").isalpha()))

отсеял бы не-альфа-слова уже на этапе генерации.

Спасибо. Не только предоставил чистый и быстрый метод для моей основной цели, но также предоставил мне средства для поиска другой счетной информации о датах в моем массиве.

user1821176 16.09.2018 23:45

@ user1821176 другим подходящим способом было бы использовать регулярное выражение, но для этого необходимо исправить формат дат. рад, что это помогает.

Patrick Artner 16.09.2018 23:51

Python имеет встроенный метод .count, который здесь очень полезен:

lista = [ 
    'Fri, 19 Aug 2011 19:28:17 -0000', 
    'Fri, 19 Aug 2011 19:28:17 -0000', 
    'Sun, 19 Jan 2011 19:28:17 -0000', 
    'Sun, 19 Aug 2011 19:28:17 -0000', 
    'Fri, 19 Jan 2011 19:28:17 -0000', 
    'Mon, 05 Feb 2012 11:00:00 -0000',
    'Mon, 05 Nov 2012 11:00:00 -0000',
    'Wed, 05 Feb 2012 11:00:00 -0000',
    'Tue, 05 Nov 2012 11:00:00 -0000',
    'Tue, 05 Dec 2012 11:00:00 -0000',
    'Wed, 05 Jan 2012 11:00:00 -0000',
]

listb = (''.join(lista)).split()

for index, item in enumerate(listb):
    count = {}
    for item in listb:
        count[item] = listb.count(item)

months = ['Jan', 'Feb', 'Aug', 'Nov', 'Dec']

for k in count:
    if k in months:
        print(f"{k}: {count[k]}")

Выход:

(xenial)vash@localhost:~/python/stack_overflow$ python3.7 count_months.py 
Aug: 3
Jan: 3
Feb: 2
Nov: 2
Dec: 1

Происходит то, что мы берем все items из lista и их join в один string. Затем мы split этой строки, чтобы получить все отдельные words. Теперь мы можем использовать метод count и создать dictionary для хранения счетчиков. Мы можем создать list из items, который мы хотим извлечь из dicionary, и получить только те keys.

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