python中.sort()和sorted()函数的/wierd输出错误

2024-10-01 04:51:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个.csv文件,以表格的形式部分类似于此: enter image description here

在本例中,每一行代表一个实体。 列“0”是指向其dbpedia页面的链接,“1”列表示标签,“2”列表示索引。它从1开始计数

最后我想要的是一个链接列表,例如列“1”,但按列“2”排序

我已经用同样的方法处理了很多其他的表,但是对于这个表,这个方法似乎失败了,我不知道为什么

import pandas as pd

entities = pd.read_csv("24142265_0_4577466141408796359.csv", header=None)

entitiesUri = [str(ent) for ent in entities[0]]
tmp = entitiesUri.copy()

#I sort 'entitiesUri' by the second column in 'entities' and the index of the link in tmp
entitiesUri.sort(key = lambda k: int(entities[2][tmp.index(k)]))

我创建了entitiesUri(tmp)的副本,以确保sort()方法在使用lambda函数中必须排序的列表时不会出错

这是“entitiesUri”的打印:

enter image description here

它没有按索引对链接进行排序,但似乎也没有按字母顺序进行排序。但不知何故,它把相同的游戏以随机顺序聚在一起

我也用过

entitiesUri = sorted(entitiesUri, key = lambda k: int(entities[2][tmp.index(k)]))

而不是sort(),但结果相同

到目前为止,唯一对我起作用的是Pandas的sort_values()函数

entities = entities.sort_values(2)

entitiesUri = [ent for ent in entities[0]]

结果正确:

enter image description here

但是这种方法让我慢了很多。知道为什么sort()和sorted()会中断吗

我已经链接到dropbox,如果你想亲自试用,你可以在那里下载.csv文件

https://www.dropbox.com/s/ld8u4td5rk4vn71/24142265_0_4577466141408796359.csv?dl=0


Tags: 文件csvthe方法lambdain列表index
1条回答
网友
1楼 · 发布于 2024-10-01 04:51:49

第一种方法不能像您预期的那样工作的原因是,您的输入在URL列中有重复项,并且list.index()返回第一个项的索引

$ grep The_Elder_Scrolls_V 24142265_0_4577466141408796359.csv
"http://dbpedia.org/resource/The_Elder_Scrolls_V:_Skyrim","the elder scrolls v: skyrim","3"
"http://dbpedia.org/resource/The_Elder_Scrolls_V:_Skyrim","the elder scrolls v: skyrim","1"
"http://dbpedia.org/resource/The_Elder_Scrolls_V:_Skyrim","the elder scrolls v: skyrim","5"

因此,例如,key = lambda k: int(entities[2][tmp.index(k)])返回3(数据帧最后一列中的值,用于上述URL的第一次出现)用于数据帧中的所有3次出现

>>> for e in tmp:
...   if e == 'http://dbpedia.org/resource/The_Elder_Scrolls_V:_Skyrim':
...       print(e, int(entities[2][tmp.index(e)]))
... 
http://dbpedia.org/resource/The_Elder_Scrolls_V:_Skyrim 3
http://dbpedia.org/resource/The_Elder_Scrolls_V:_Skyrim 3
http://dbpedia.org/resource/The_Elder_Scrolls_V:_Skyrim 3

因为3是最小的值(您可以通过从上面的列表中删除if语句来验证这一点),所以URL会首先出现在sorted()sort()的输出中,并出现3次。删除if语句也会清楚地说明为什么排序entitiesUri会产生您得到的结果

相关问题 更多 >