繁体   English   中英

Python,排序 function:按值排序字典返回意外列表

[英]Python, sorted function: sort dictionary by value returns unexpected list

我正在学习 python 排序 function,我有一个 sample_dictionary,我尝试按其值排序。 示例如下: 姓名:年龄对

sample_dict = {'andi': 65, 'george': 34, 'elvis': 44, 'david': 25, 'caleb': 18, 'broady': 27}
# Let's sort a dictionary by value
print("Key-based sort: ", sorted(sample_dict, key=lambda sample_dict: sample_dict[1]))

预期结果如下,因为 caleb 的年龄只有 18 岁,为什么 andi 的年龄是 65 岁:

['caleb', 'david','broady','george','elvis','andi']

但是当我在 python 3 中运行时,结果如下:

['david', 'caleb', 'george', 'elvis', 'andi', 'broady']

大卫25岁,迦勒18 安迪是老大....

为什么 为什么 为什么? 我的理解是错误的 sample_dict[1] 并不意味着年龄?

它将被sorted(sample_dict.items(), key = lambda x: x[1])

当您调用sample_dict.items()时,它返回一个元组列表,然后 sorted 方法对其进行迭代并使用 lambda 进行排序。

如果您不在sample_dict.items()上调用它,则 lambda 中的x获取键值。 你它排序在名称的第二个字符。

@Karl 指出的另一种方法是: sorted(sample_dict, key = lambda x: sample_dict[x])

key=lambda sample_dict: sample_dict[1]

在 lambda 中, sample_dict不是原始 dict 的名称,而是(因为您重新使用了参数的名称)在 output 中排序的每个 dict 键的名称。 这些键是字符串,因此根据使用[1]索引这些字符串的结果对它们进行排序。

所以'david''caleb'是第一个,因为'david'[1]'caleb'[1]都是'a' ,依此类推。

您想要的是使用lambda的参数来索引sample_dict ,因此它需要一个单独的名称。 因此,例如: key=lambda name: sample_dict[name]

或者, [1]建议您对 dict 的项目(键值对)进行排序。 您需要明确要求: sorted(sample_dict.items(), key=... 。然后我们可以填写我们的密钥 - 现在[1]是所需的索引。我们仍然应该为lambda参数使用不同的名称,不过,为了避免混淆。

当您执行 sample_dict[1] 时,您将 go 指向键(名称)的第二个字母。 它是键:值对而不是列表。 您可以使用此代码

x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
{k: v for k, v in sorted(x.items(), key=lambda item: item[1])}

改变

print("Key-based sort: ", sorted(sample_dict, key=lambda sample_dict: sample_dict[1]))

print("Key-based sort: ", sorted(sample_dict, key=lambda s: sample_dict[s]))

您的代码不起作用的原因是sorted将接收一个数组,并对每个元素进行排序。
你知道,如果你遍历一个像这样的字典:

for k in dct:
    ...

该程序将遍历键,它们是字符串,仅此而已。 因此,您正在寻找sorted()的键将是dict[key]

下面将正确吐出您正在寻找的结果。 lambda function 中的“x”指的是字典的键。

print("Key-based sort: ", sorted(sample_dict, key=lambda x: sample_dict[x]))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM