首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >统计发生的项目次数

统计发生的项目次数
EN

Stack Overflow用户
提问于 2017-12-10 22:22:13
回答 3查看 53关注 0票数 0

假设我有以下列表名称= 'tan','2','alp','3','tan','4','alp','3','tan','1‘

奇数索引元素是一些值,偶数索引元素是它们出现的次数(例如,alp发生了6次3+3 =)

我试着做代码来做这件事。

在这里输入代码

代码语言:javascript
运行
复制
names = ['tan','2','alp','3','tan','4','alp','3','tan','1']

i = 1;
dd = names[0::2]
nn = names[1::2]
ct = [0 for cc in range(len(dd))];
le = len(dd);

for i in range(0, le):
    ct[i] = int(nn[i])
    for j in range(i+1, le):
        if (j < le) and (dd[i] == dd[j]):
            ct[i] += int(nn[j]);
            del(dd[j])
            # del(nn[j])
            le -= 1

ct的输出是9,7,4,3,1,但是对于tan和alp,它应该是7,6-7,6-7。

如果我没有注释del(nnj) --我将等于le,代码将停止。

但是,我应该删除元素和它在第一次之后发生的次数(在ct中确定添加之后),这样计数过程就不会重复。

知道怎么做吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-10 22:41:38

这相对容易--从奇数元素构建一个查找映射,然后对匹配的偶数值进行求和。您可以使用collections.defaultdict()使您的生活更轻松:

代码语言:javascript
运行
复制
import collections

names = ['tan', '2', 'alp', '3', 'tan', '4', 'alp', '3', 'tan', '1']

lookup_map = collections.defaultdict(int)
for element, value in zip(names[0::2], names[1::2]):
    lookup_map[element] += int(value)

print(dict(lookup_map))  # {'tan': 7, 'alp': 6}

如果您确实只需要值并且需要保持顺序,则可以添加一个附加步骤:

代码语言:javascript
运行
复制
result = [lookup_map.pop(element) for element in names[0::2] if element in lookup_map]

print(result)  # [7, 6]

如果您在每个元素计算的事件/总次数之后,只需在整个查找地图上应用总和:

代码语言:javascript
运行
复制
sum_total = sum(lookup_map.values())
for name in lookup_map:
    lookup_map[name] /= sum_total

print(dict(lookup_map))  # {'alp': 0.46153846153846156, 'tan': 0.5384615384615384}
票数 1
EN

Stack Overflow用户

发布于 2017-12-10 22:38:59

比起列表,我们可以更容易地使用字典来记录计数。下面我使用一个defaultdict,它是支持默认值的标准库中的dict子类。

代码语言:javascript
运行
复制
from collections import defaultdict

names = ['tan','2','alp','3','tan','4','alp','3','tan','1']

d=defaultdict(int)
for name, count in zip(*[iter(names)]*2):
    d[name] += int(count)
票数 2
EN

Stack Overflow用户

发布于 2017-12-10 22:45:30

您可以使用un对象来存储每个名称的出现。

代码语言:javascript
运行
复制
names = ['tan','2','alp','3','tan','4','alp','3','tan','1']

# Use an object to store occurences
results = {}

# Iterate through 'names' to get occurences
for i in range(len(names)):
    if i % 2 == 0:
        # Store them in the object
        if names[i] in results: # if 'name' exist in results object
            results[names[i]] += int(names[i+1])
        else:                   # if it doesn't
            results[names[i]] = int(names[i+1])

# Get the value only array
res_arr = [v for k,v in results.items()]
print results
print res_arr

这将产生以下结果:

代码语言:javascript
运行
复制
{'tan': 7, 'alp': 6}
[7, 6]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47744106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档