假设我有以下列表名称 = ['tan','2','alp','3','tan','4','alp','3','tan','1']
奇数索引元素是一些值,偶数索引元素是它们的出现次数(例如 alp 发生了 3+3 = 6 次)
我正在尝试编写代码来做到这一点。
在这里输入代码
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] 但是它应该是 [7, 6] --- 7 代表棕褐色,6 代表 alp
如果我取消注释 del(nn[j]) ---我将等于 le 并且代码将停止
但我应该删除该元素以及它在第一次之后的任何时间发生的次数(在确定将其添加到 ct 之后),这样计数过程就不会重复
知道怎么做吗?
这相对容易 - 从奇数元素构建查找图,然后对匹配的偶数值求和。您可以使用以下collections.defaultdict()
方法让您的生活更轻松:
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}
如果你真的只需要值并且需要保持顺序,你可以添加一个额外的步骤:
result = [lookup_map.pop(element) for element in names[0::2] if element in lookup_map]
print(result) # [7, 6]
如果您在每个元素计算的出现次数/总出现次数之后,您可以在整个查找地图上应用总和:
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}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句