将这个列表转换成字典:Python

3

我有一个问题,不知道如何在Python中编写代码。

我有一个list[10, 10, 10, 20, 20, 20, 30]

我希望它成为一个像这样的字典

{"10": 1, "20":  3, "30" : 1}

我该如何实现这个?

4
如果您要计算该列表中的项目数量,那么它不会是 {"10": 3, "20":3, "30":1} 吗?如果不是,那么这个字典是如何编制的?键对应的值是什么? - Anthony Forloney
1
可能是重复的问题:如何在Python中获取列表中的项目计数? - Ignacio Vazquez-Abrams
defaultdict 解决所有问题。 - nearlymonolith
4个回答

16
from collections import Counter
a = [10, 10, 10, 20, 20, 20, 30]
c = Counter(a)
# Counter({10: 3, 20: 3, 30: 1})
如果您真的希望将键转换为字符串,那么这是一个单独的步骤:
dict((str(k), v) for k, v in c.iteritems())

这个类是在Python 2.7中新增的;对于早期版本,请使用以下实现:

http://code.activestate.com/recipes/576611/


编辑:我把代码放在这里,因为SO不允许我把代码粘贴到评论中。

from collections import defaultdict
def count(it):
    d = defaultdict(int)
    for j in it:
        d[j] += 1
    return d

4

另一种不使用setCounter的方法:

d = {}
x = [10, 10, 10, 20, 20, 20, 30]
for j in x:
    d[j] = d.get(j,0) + 1

编辑:对于包含100个独特项的大小为1000000的列表,该方法在我的笔记本电脑上运行时间为0.37秒,而使用set的答案需要2.59秒。对于仅有10个独特项的情况,前一种方法需要0.36秒,而后一种方法仅需要0.25秒。
编辑:使用defaultdict的方法在我的笔记本电脑上只需0.18秒。

如果这是一场性能竞赛,请查看我在答案中放置的defaultdict版本(因为SO不让我在这里粘贴),它大约快了两倍。 - Glenn Maynard
感谢您的评论。您说得非常正确:您的方法在我的笔记本电脑上运行了0.18秒。 - Steve Tjoa

1

像这样

l = [10, 10, 10, 20, 20, 20, 30]
uniqes = set(l)
answer = {}
for i in uniques:
    answer[i] = l.count(i)

answer 现在是您想要的字典

希望这可以帮到您


1
在 Python >= 2.7 中,您可以使用字典推导式,例如:
>>> l = [10, 10, 10, 20, 20, 20, 30]
>>> {x: l.count(x) for x in l}
{10: 3, 20: 3, 30: 1}

不是最快的方式,但非常适合小型列表

更新

或者,受inspectorG4dget启发,这个更好:

{x: l.count(x) for x in set(l)}

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