首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >排序字典,但得到“列表索引必须是int,而不是元组”错误

排序字典,但得到“列表索引必须是int,而不是元组”错误
EN

Stack Overflow用户
提问于 2019-07-12 20:28:10
回答 2查看 404关注 0票数 1

我试图使用排序()函数,因为OrderedDict对我来说是不可用的(python2.6.6)。但是,我得到了“列表索引必须是int,而不是tuple”错误。

我试着在字典中使用排序()函数,当我尝试使用一些虚拟值时,它工作得很好,但是我不知道为什么它不能在我的特定代码上工作。

代码语言:javascript
复制
   venue_dict = {}
   for venues in venue_names:
       venue_dict[venues] = False
   venue_dict = sorted(venue_dict)

我得到了这个TypeError:列表索引必须是整数,而不是str

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

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

EN

回答 2

Stack Overflow用户

发布于 2019-07-12 20:41:21

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

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

代码语言:javascript
复制
mydict = sorted(mydict, key=lambda k: k[0])  # just the key from the (key, value) tuple

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

代码语言:javascript
复制
mydict = sorted(mydict.items())

然而,上面的语句将返回元组列表。如果您想要一个实际的有序字典,您必须使用一个OrderedDict。由于您使用的是Python2.6,这只是Python2.7中的一部分,您可以通过运行秩序来通过PIP安装pip install ordereddict包。然后:

代码语言:javascript
复制
from ordereddict import OrderedDict

mydict = OrderedDict(sorted(mydict.items()))
票数 2
EN

Stack Overflow用户

发布于 2019-07-12 20:49:14

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

代码语言:javascript
复制
venue_dict = {name:False for name in sorted(venue_names)}

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

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

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

代码语言:javascript
复制
venue_dict = OrderedDict( (name,False) for name in sorted(venue_names) )

如果其他所有操作都失败,则可以从排序的键访问字典:

代码语言:javascript
复制
venue_dict = dict()
for name in venue_names: venue_dict[name] = False

for name in sorted(venue_dict):
    print(name, venue_dict[name])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57013674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档