【发布时间】:2014-03-26 16:27:06
【问题描述】:
这种排序是出于教育目的。不允许内置排序。
如果您认为我的问题和答案有帮助,请投票给我和第一个回答的人: @J.F.塞巴斯蒂安
我在 SO 上找到了这个—— "How to do an insertion sort on a list of dictionaries in python?"
但这个答案似乎不对。
使用上述问题的答案代码会引发此错误:
TypeError:列表索引必须是整数,而不是字典
例子:
lst = [{'a':20, 'b':30, 'c':25, 'd': 600},{'a':60, 'b':10, 'c':43, 'd': 20}]`
使用插入排序进行排序,例如排序b,我们应该得到
[{'a':60, 'b':10, 'c':43, 'd': 20},{'a':20, 'b':30, 'c':25, 'd': 600}]
但是我的代码得到了
[{'b': 10, 'c': 25, 'a': 20, 'd': 600}, {'b': 30, 'c': 43, 'a': 60, 'd': 20}]
他替换了字典列表中的键和值
这是我的代码:
def insertionSort(allData, key):
for i in range(len(allData)):
temp = allData[i][key]
j = i
while j > 0 and temp < allData[j - 1][key]:
allData[j][key] = allData[j - 1][key]
j = j - 1
allData[j][key] = temp
我的作业排序结果:
{'snow': 19.2, 'minT': -10.8, 'month': 12, 'maxT': 9.0, 'rain': 45.0, 'year': 2003, 'meanT': -0.1, 'yearmonth': 193801}
{'snow': 35.6, 'minT': -20.0, 'month': 1, 'maxT': 8.9, 'rain': 34.3, 'year': 1974, 'meanT': -5.9, 'yearmonth': 193802}
{'snow': 0.0, 'minT': 9.7, 'month': 8, 'maxT': 34.8, 'rain': 20.8, 'year': 2007, 'meanT': 22.4, 'yearmonth': 193803}`
对yearmonth进行排序后,他们将yearmonth从小到大替换,但不改变字典。
为什么会发生这种情况,我应该如何改变它?
===================================
答案:
在“J.F.”的一些基本副本之后。塞巴斯蒂安密码 我发现我不能直接使用代码
sort(a,b)
输出:
TypeError: 'str' 对象不可调用
我应该使用 排序(a,b=lambda x: x['thekey']) 然后,JFS 制作了一个新函数来使其工作。
我还找到了另一种方法: 只需更改 JFS 代码第 5 行:
来自
if key(L[j]) <= key(d):
到
if L[j][key] <= d[key]:
然后一切正常! 希望这也可以帮助其他人,以及那些使用谷歌并与我做相同任务的人。
【问题讨论】:
-
我不太明白这个问题。这是关于如何对字典列表进行排序,比较该列表中所有字典中存在的给定键的值?
-
字典的排序标准是什么?内置
sorted返回第二个结果(如果字典相同)。注意:inside 字典的键是无序的,即{'a':1, 'b':2}和{'b':2, 'a':1}是相同的。 -
问题是我如何通过字典中的键值对dict列表进行排序
-
@J.F.Sebastian - 重点是不允许使用内置排序。
标签: python sorting python-3.x dictionary