目标是创建一个堆叠条形图,显示总共 360 秒(按秒)内推文(我从 tweepy 获得)的情绪。我有两个 list 。第一个按时间顺序对推文进行情感分析,第二个按时间顺序显示每秒的推文数量。
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 之外,我不想使用任何库。
最佳答案
代码:
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
关于python - 根据第二个列表中的位数对列表项进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53600635/