【问题标题】:Sorting a dictionary but got "List Indices must be int, not tuple" error对字典进行排序但出现“列表索引必须是整数,而不是元组”错误
【发布时间】:2019-07-12 20:28:10
【问题描述】:

我正在尝试使用 sorted() 函数,因为 OrderedDict 对我不可用(python 2.6.6)。但是我得到这个“列表索引必须是整数,而不是元组”错误

我尝试在字典上使用 sorted() 函数,当我尝试使用一些虚拟值时它工作正常,但我不确定为什么它不适用于我的特定代码。

   venue_dict = {}
   for venues in venue_names:
       venue_dict[venues] = False
   venue_dict = sorted(venue_dict)

我得到这个 TypeError: list indices must be integers, not str

所以我为每个场地创建了一个值为 False 的字典。 (venue_names 是所有场地名称的列表) false 只是用作标志值。

无论如何,我尝试打印已排序的字典但收到元组错误。 有谁知道为什么?我尝试用谷歌搜索,但还没有找到解决方案。

【问题讨论】:

  • 请包含完整的错误回溯,因为这可以帮助我们更好地帮助您。

标签: python sorting dictionary


【解决方案1】:

内置的sorted() 函数不适用于具有默认参数的字典,因为默认排序键将是(键,值)对。这是一个元组,而不是可排序的项目。

您可以通过 lambda 函数确保字典键用作排序键:

mydict = sorted(mydict, key=lambda k: k[0])  # just the key from the (key, value) tuple

或者,您可以直接对字典的项目进行排序:

mydict = sorted(mydict.items())

然而,上面的语句将返回元组列表。如果你想要一个实际的有序字典,你必须使用OrderedDict。由于您使用的是 Python 2.6,而这只是 Python 2.7 中的一个东西,您可以通过运行 pip install ordereddict 通过 PIP 安装 ordereddict 包。那么:

from ordereddict import OrderedDict

mydict = OrderedDict(sorted(mydict.items()))

【讨论】:

  • 在他们提到 OrderedDict 对他们不可用的问题中。
  • python3.6 将保留插入顺序作为规范的一部分。只需使用dict 构造函数@CalderWhite 从结果中创建一个新字典
  • 谢谢@CalderWhite,错过了那个。在这种情况下,我建议只使用有序的元组列表,否则在 Python 2.6 中可以使用 ordereddict PIP package 提供 OrderedDict 功能。我将编辑我的答案以反映这一点
【解决方案2】:

如果您从排序列表创建字典,它将立即以正确的顺序排列:

venue_dict = {name:False for name in sorted(venue_names)}

注意venue_dict = sorted(venue_dict) 会将venue_dict 变量更改为一个列表,因为sorted(venue_dict) 返回一个键列表,它不会对字典进行排序。这可能是您在后续使用venue_dict 时遇到错误的原因。

顺便说一句,如果您使用的是旧版本的 Python(例如 2.7),则字典没有定义的顺序,因此根本无法对它们进行排序。您应该更新到最新版本的 Python 或使用双重间接:例如访问排序的名称列表-> 使用名称作为字典的下标。

我实际上无法检查这一点,但我相信旧版本 OrderedDict 的构造函数会以相同的方式工作:

venue_dict = OrderedDict( (name,False) for name in sorted(venue_names) )

如果一切都失败了,你总是可以从排序的键访问字典:

venue_dict = dict()
for name in venue_names: venue_dict[name] = False

for name in sorted(venue_dict):
    print(name, venue_dict[name])

【讨论】:

  • 这个字典理解可能只适用于 Python 3+。我只安装了 Python 3.7,所以我实际上无法检查需要哪个版本。
猜你喜欢
  • 2012-03-11
  • 1970-01-01
  • 2016-01-08
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
相关资源
最近更新 更多