将列表转换为字典

4

这里有一个列表:

List= ["sugar:10", "coffee:23", "sugar:47", "salt:26"]

我需要从该列表中获取字典:

Dict = {"sugar":57, "coffee":23, "salt":26}

我以前做过一些类似的例子,但是这个例子我只有一个大致的想法(首先要拆分列表),如果有两个值有相同的键,我需要将它们加在一起。

请问有人可以帮忙并给我解决这个问题的思路吗?


键名可以包含分号吗? - Willem Van Onsem
5个回答

5

您可以通过 defaultdict 轻松实现此操作:

from collections import defaultdict

li = ["sugar:10", "coffee:23", "sugar:47", "salt:26"]

d = defaultdict(int)

for item in li:
    split_item = item.split(':')
    d[split_item[0]] += int(split_item[1])

print(d)
#  defaultdict(<class 'int'>, {'sugar': 57, 'coffee': 23, 'salt': 26})

仅供未来读者参考,值得注意的是dictdefaultdict之间的区别在于,如果未找到键,则defaultdict返回项类型的默认值,而dict会引发KeyError异常。 - user955340
而defaultdict在这方面更快。 - Jean-François Fabre

4

您可以使用计数器(Counter)做一些有趣的事情!

from collections import Counter

def f(x):
    x, y = x.split(':')
    return Counter({x : int(y)})

sum(map(f, lst), Counter())

Counter({'coffee': 23, 'salt': 26, 'sugar': 57})

如果你关注性能,使用循环可能更加合适。
r = Counter()
for x in lst:
    r.update(f(x))

r
Counter({'coffee': 23, 'salt': 26, 'sugar': 57})

1
太棒了。 - Ma0
1
很好。我关心sum的性能,因为它不是原地复制字典(这就是为什么你不想使用sum来展平列表的原因)。 - Jean-François Fabre
sum函数不使用 result += current 而是使用 result = result + current 以避免修改初始化参数,因此它不能被优化:https://dev59.com/vZ_ha4cB1Zd3GeqP27K6 - Jean-François Fabre
1
@Jean-FrançoisFabre 好的,所以不是 __iadd__ 而是 __add__... 在这里 - https://github.com/python/cpython/blob/master/Lib/collections/__init__.py#L698 看起来一个新的 Counter 被初始化了,但我不知道它的效率如何。你是对的,循环可能更好(已添加)。 - cs95
糟糕,之前的链接指向了其他奇怪的地方...现在已经修复了。 - cs95

0
mydict={}
for i in List:
    splited=i.split(":")
    if(splited[0] in mydict):
        mydict[splited[0]]+=int(splited[1])
    else:
        mydict[splited[0]]=int(splited[1])

3
这并不是对数值求和。 - DeepSpace
希望现在它可以了。 - imox

0

这个也应该可以工作。

from collections import defaultdict
d = defaultdict(int)
b = map(lambda x: (x[0], int(x[1])), [x.split(':') for x in li])
for k, v in b:
    d[k] += v

>>>d
defaultdict(<type 'int'>, {'coffee': 23, 'salt': 26, 'sugar': 57})

-1

由于字典在其构造函数中获取一个列表,因此您可以简单地根据需要动态生成一个列表。

这是代码:

>>> from collections import defaultdict
>>> l = ["sugar:10", "coffee:23", "sugar:47", "salt:26"]
>>> items = (i.split(":") for i in l)
>>> d = defaultdict(int)
>>> for i in items:
...     d[i[0]]+= int(i[1])
>>> dict(d)
{'coffee': 23, 'salt': 26, 'sugar': 57}

检查你的答案和@DeepSpace的答案。现在它们完全相同了(你可以再次标记我的评论进行删除,但这不会改善你的答案)。 - Jean-François Fabre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接