如何再次将其转换为元组键值列表?

时间:2019-06-04 07:04:26

标签: python python-3.x list jupyter-notebook tuples

我要转换它:

[('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'对象不可迭代”。

3 个答案:

答案 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}