Как посчитать определенные элементы строки в большом массиве? - PullRequest
0 голосов
/ 17 сентября 2018

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

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

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

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

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

0 голосов
/ 17 сентября 2018

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

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()))

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...