Группировка элементов списка по количеству цифр во втором списке - PullRequest
0 голосов
/ 03 декабря 2018

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

list1 = ("neg", "pos", "pos", "neu", "neg", "pos", "neu", "neu",...)
list2 = (2, 1, 3, 2,...)

Теперь я хотел бы создать своего рода вложенный цикли использовать list2 для подсчета элементов в списке 1. Затем у меня будет 3 списка с 360 значениями для каждого настроения, которое я могу использовать для графика.Это должно дать мне вывод, похожий на этот:

lis_negative = (1, 0, 1, 0, ...)
lis_positive = (1, 1, 1, 0, ...)
lis_neutral = (0, 0, 1, 2, ...)

Как я могу создать этот цикл и есть ли более простой подход к нему?Я бы предпочел не использовать для этого какую-либо библиотеку, кроме matplotlib.

1 Ответ

0 голосов
/ 03 декабря 2018

Код:

from itertools import islice
from collections import Counter

def categorize(clas, amounts):
    cats = {'neg': [], 'pos': [], 'neu': []}
    clas = iter(clas)

    for a in amounts:
        cs = Counter(islice(clas, a)) # take a items
        for cat in cats:
            cats[cat].append(cs[cat])
    return cats

Демонстрация:

>>> t1 = ('neg', 'pos', 'pos', 'neu', 'neg', 'pos', 'neu', 'neu')
>>> t2 =  (2, 1, 3, 2)
>>> 
>>> categorize(t1, t2)
{'neg': [1, 0, 1, 0], 'neu': [0, 0, 1, 2], 'pos': [1, 1, 1, 0]}

По запросу, решение без импорта:

def make_counter(iterable):
    c = {}
    for x in iterable:
        c[x] = c.get(x, 0) + 1
    return c

def categorize(clas, amounts):
    cats = {'neg': [], 'pos': [], 'neu': []}
    pos = 0

    for a in amounts:
        chunk = clas[pos:pos+a]
        pos += a
        cs = make_counter(chunk)
        for cat in cats:
            cats[cat].append(cs.get(cat, 0))
    return cats

редактировать: более короткое решение без импорта:

def categorize(clas, amounts):
    cats = {k:[0]*len(amounts) for k in ('neg', 'pos', 'neu')}
    pos = 0

    for i, a in enumerate(amounts):
        chunk = clas[pos:pos+a]
        pos += a
        for c in chunk:
            cats[c][i] += 1

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