Python:按键排序列表返回错误:“字符串必须为整数”

7

我一直在寻找答案,但却没有结果,希望有人能指导我正确的方向。我的问题是:

  • 调用一个包含json格式文件的url
  • 将返回的字典转换成列表(我认为不需要插入的键)
  • 通过一个关键字(“loved_count”)对列表中的项进行排序

我的代码如下:

url = "http://hypem.com/playlist/tags/dance/json/1/data.js"
output = json.load(urllib.urlopen(url))
output = output.values() #convert dict to list
output = output.sort(key=itemgetter('loved_count')) #sort list by loved_count

这会导致以下错误:

output = output.sort(key=itemgetter('loved_count')) #sort list by loved_count
TypeError: string indices must be integers

有没有想法,我在哪里搞砸了?提前感谢!

2
两个问题:1)'loved_count'是什么?2)为什么要将字典转换为列表(这样会丢失所有键中的信息)? - SethMMorton
我对你的第三个要求“按照关键字('loved_count')对列表中的项目进行排序”感到困惑。你能解释一下你的意思吗? - SethMMorton
当然。'loved_count' 存储了 hypem 网站上某个项目被“喜欢”的次数。我使用列表来排序元素...字典是无序的,如果我没记错的话,它不会让我先排序,然后对列表进行其他操作。 - user3007578
基于 @falsetru 的答案,您忽略了一个非常有价值的信息,即列表中的每个元素都应该是一个 dict。这将有助于消除您对 itemgetter 的操作目的的困惑。 - SethMMorton
1个回答

7
列表中的一个项目不是字典:
>>> import urllib
>>> import json
>>> url = "http://hypem.com/playlist/tags/dance/json/1/data.js"
>>> output = json.load(urllib.urlopen(url))
>>> for x in output.values():
...     print(type(x))
... 
<type 'dict'>
<type 'dict'>
<type 'dict'>
<type 'dict'>
<type 'dict'>
<type 'unicode'>
<type 'dict'>
....

>>> u'1.1'['loved_count']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: string indices must be integers

您可以通过过滤掉非字典项来解决问题:

>>> items = [x for x in output.values() if isinstance(x, dict)]
>>> items.sort(key=itemgetter('loved_count'))
# No error.

但是,我更愿意向数据提供者询问数据存在什么问题,因为支持数组/列表包含异构数据。


顺便说一下,代码正在给sort的返回值赋值。 sort返回None;你失去了这个列表。删除赋值语句,只需调用sort


或者使用sorted代替sort——当您确实希望拥有(浅)副本的情况下。 - Thorsten Kranz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接