我要转换它:
[('user1', 10),('user2',2),('user2',24),('user1',10),('user3',15),('user3',8)]
对此:
[('user2', 0.52), ('user3', 0.46), ('user1', 0.4)]
我需要添加值,按用户分组,应用2%的比率,并按后代值排序。
我用libs完成了解决方案,但是我只想用条件语句来完成。我正在使用jupyter笔记本。
e = [('user1', 10),('user2',2),('user2',24),('user1',10),('user3',15),('user3',8)]
type(e)
users = ["user1","user2","user3"]
for u in users:
value = 0
for t in e:
user = t[0]
if user == u:
value = value + t[1]
finalValue = value* 0.02
我已经尝试了很多次来转换"finalValue"
,但是我收到了消息
“'float'对象不可迭代”。
答案 0 :(得分:3)
使用collections.defaultdict
例如:
from collections import defaultdict
result = defaultdict(int)
data = [('user1', 10),('user2',2),('user2',24),('user1',10),('user3',15),('user3',8)]
for k, v in data:
result[k] += v
result = {k: v*0.02 for k, v in result.items()}
#or result = [(k, v*0.02) for k, v in result.items()]
print(result)
输出:
{'user2': 0.52, 'user3': 0.46, 'user1': 0.4}
答案 1 :(得分:1)
您的代码仅需进行一些修改即可使其执行您想要的操作:
e = [('user1', 10),('user2',2),('user2',24),('user1',10),('user3',15),('user3',8)]
type(e)
users = ["user1","user2","user3"]
f = [] # initialize list for storing final values
for u in users:
value = 0
for t in e:
user = t[0]
if user == u:
value = value + t[1]
finalValue = value* 0.02
f.append((u, finalValue)) # add final value to list
有了这个,我得到f
的信息:
[('user1', 0.4), ('user2', 0.52), ('user3', 0.46)]
答案 2 :(得分:0)
这是另一种方式。首先,获得一组唯一用户,然后对出现该唯一用户的所有实例求和。然后使用dict-comprehension获得结果:
l = [('user1', 10),('user2',2),('user2',24),('user1',10),('user3',15),('user3',8)]
uniq_user = set(m[0] for m in l)
# uniq_user = {'user1', 'user2', 'user2'}
l2 = [(i, sum(n[1] for n in l if n[0]==i)) for i in uniq_user]
# l2 = [('user3', 23), ('user1', 20), ('user2', 26)]
outp = {i1 : i2*0.02 for i1,i2 in l2}
输出:
{'user3': 0.46, 'user1': 0.4, 'user2': 0.52}