【问题标题】:Python: how to convert a dictionary into a subscriptable array?Python:如何将字典转换为可下标数组?
【发布时间】:2016-02-13 22:19:36
【问题描述】:

我知道如何在 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(......) 作为我无法删除的输出。我该如何解决这个问题?

【问题讨论】:

  • 这里你应该非常小心......正如所写的,没有办法知道你将从这个表达式中得到哪些值。例如答案可能是34567(它可能会从一个运行更改为下一个运行),因为您无法保证第二个和第三个值因为 dict 是无序的。
  • 在我的实际字典中,值已经按顺序写入其中。那么将其转换为列表不会确保一切正常吗?
  • 没有。 (大多数情况下)将元素写入字典的顺序无关紧要——它们可以以完全不同的顺序返回。如果您想保留订单,请确保使用collections.OrderedDict

标签: python python-3.x dictionary


【解决方案1】:

在 python-3.X 中,dict.values 不会像在 python-2.X 中那样返回 list 对象。在 python-3.x 中,它返回一个 dict-value 对象,这是一个类似集合的对象,并使用哈希表来存储其不适合索引的项目。此功能除了支持大部分set 属性外,还针对成员资格检查(使用in 运算符)等操作进行了非常优化。

如果你想得到一个列表对象,你需要通过将结果传递给list()函数将其转换为列表。

the_values = dict.values()
SUM = sum(list(the_values)[1:10])

【讨论】:

  • 它给出了错误TypeError: 'dict_values' object is not callable
  • @VishnuUpadhyay 你用过values=dict.values()吗?我提到不要使用built-in 名称作为变量名。
【解决方案2】:

通过将dict.values() 分配给列表,您不会将其转换为列表;您只是将其存储为 dict_values (可能是一个对象)。要转换它写value_list=list(dict.values())。现在,即使在打印 value_list 时,您也会得到列表元素,而不是 dict_values(......)

如前所述,不要使用 Python 内置名称作为变量名;它可能会导致执行期间的冲突和阅读代码时的混乱。

【讨论】:

    【解决方案3】:

    @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 访问您的“值”,但它不会按顺序排列。

    【讨论】:

    【解决方案4】:

    是的,它确实看起来像这里提出的旧 Python 问题的列表。但正如@Kasramvd 所说,假设您使用的是python 3.X,dict.values 是一个字典视图对象。 (另外,你肯定是匆忙想出了这个例子,因为你有四个字典条目,但想要 10 个列表项,这是多余的。)

    【讨论】:

    • 感谢您指出字典视图对象是什么,我认为它只是让您“看到”字典中的内容。
    猜你喜欢
    • 2017-07-21
    • 2021-05-15
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 2014-02-19
    相关资源
    最近更新 更多