Python:如何将字典转换为可下标数组



我知道如何用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访问您的"值",但它不会按顺序排列。

最新更新