我知道如何用Python将字典转换为列表,但不知何故,当我试图获得结果列表的总和时,我得到了错误'dict_values' object is not subscriptable
。此外,我计划只总结列表中的几个项目。
dict = {A:1, B:2, C:3, D:4}
arr = dict.values()
the_sum = sum(arr[1:3])
经过仔细检查,我注意到当打印出结果列表时,它总是给出dict_values(......)
作为我无法删除的输出。我该如何解决这个问题?
在python-3.X中,dict.values
不会像在python2.X中那样返回list
对象。在python-3.X中,它返回一个类似集合的dict-value
对象,并使用哈希表来存储不适合索引的项。除了支持大多数set
属性外,此功能还针对成员身份检查(使用in
运算符)等操作进行了优化。
如果您想要获得一个list对象,您需要通过将结果传递给list()
函数将其转换为list。
the_values = dict.values()
SUM = sum(list(the_values)[1:10])
将dict.values()
分配给列表并不是将其转换为列表;您只是将其存储为dictvalue(可能是一个对象)。要转换它,请写入value_list=list(dict.values())
。现在,即使在打印value_list
时,您也会得到列表元素,而不是dict_values(......)
。
如前所述,不要使用Python内置名称作为变量名称;它可能会在执行过程中引起冲突,并在读取代码时引起混乱。
使用list(dictObj.values())
包装dict_values
对象并不总是成功的,尤其是当生成的dict_values
列表包含不同的数据时。
它将抛出错误:
{TypeError} 'generator' object is not callable
如果您收到此错误,请尝试使用for compensation生成可迭代列表:
[x for x in dictObj.values()]
它将完成的工作
是的,它看起来确实像是这里提出的旧Python问题的列表。但正如@Kasramvd所说,假设您使用的是python 3.X,dict.values
是一个字典视图对象。(此外,您肯定是匆忙地想出了这个例子,因为您有四个字典条目,但想要10个列表项,这是多余的。)
使用list()
构造函数创建一个新列表,只是为了对其进行切片,这是浪费。使用内置itertools
模块中的islice
将更加高效。
from itertools import islice
dct = {'A':1, 'B':2, 'C':3, 'D':4}
arr = dct.values()
the_sum = sum(islice(arr, 1, 3))
the_sum
# 5
不同之处在于,效率是显而易见的,尤其是当字典很大,但切片相对较小时。例如,对于一个10mil键值对的字典,如果你对20个键值对进行切片并求和,islice
比构建列表并对其进行切片快约39400倍。
n = 10_000_000
dct = dict(zip(range(n), [0,1,2,3,4]*(n//5)))
%timeit sum(list(dct.values())[10:30])
# 120 ms ± 813 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit sum(islice(dct.values(), 10, 30))
# 3.04 µs ± 19.4 ns per loop (mean ± std. dev. of 7 runs, 100 loops each)
即使切片很大,islice
仍然更快(尽管没有小切片那么引人注目)
%timeit sum(list(dct.values())[1:n])
# 277 ms ± 2.24 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit sum(islice(dct.values(), 1, n))
# 181 ms ± 4.9 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
@mgilson是对的。字典从本质上讲是没有秩序的。
你仍然可以这样做:
alpha = {"A":1,"B":2,"C":3,"D":4,"E":5} # dictionary
my_list = []
for key,value in alpha.items() :
my_list.append(value)
您可以从my_list
访问您的"值",但它不会按顺序排列。