Python 为什么lambda函数从dict.items()和元组列表中获取数据的方式不同?

Python 为什么lambda函数从dict.items()和元组列表中获取数据的方式不同?,python,python-3.x,Python,Python 3.x,我正试着按键对字典进行分类。如果我像上面那样使用lambda表达式,排序就可以工作了。但在这里,当我使用符号x[0]时,我感到困惑。要按键名排序,不应该是x[0][0]吗 我可以看到,dict.items()返回的dict_视图看起来类似于元组列表,那么为什么在排序x[0]时返回字符串对象,而在下面的元组列表“AtmNum”中,lambda返回元组呢 atomicNumber = {'Rubidium(Rb)':37, 'Lithium(Li)': 2, 'Argon(Ar)': 18 ,'So

我正试着按键对字典进行分类。如果我像上面那样使用lambda表达式,排序就可以工作了。但在这里,当我使用符号x[0]时,我感到困惑。要按键名排序,不应该是x[0][0]吗

我可以看到,dict.items()返回的dict_视图看起来类似于元组列表,那么为什么在排序x[0]时返回字符串对象,而在下面的元组列表“AtmNum”中,lambda返回元组呢

atomicNumber = {'Rubidium(Rb)':37, 'Lithium(Li)': 2, 'Argon(Ar)': 18 ,'Sodium(Na)': 11, 'Potassium(K)':19, 'Hydrogen(H)': 1,}
sort_atomicNumber = dict(sorted(atomicNumber.items(), key = lambda x: x[0]))
print(sort_atomicNumber)
输出: ('Rubidium(Rb)'37)

atomicNumber.items()
生成
tuple
s,因此,例如,在第一次迭代中,生成的
tuple
('Rubidium(Rb)'37)
(由
x
引用),因此,
x[0]
将是键,
x[1]
将是值

当您尝试模拟它时,您将
dict_items
作为参数传递给
lambda
函数,而在
sorted
函数中,
dict_items
内的
元组是传递给
lambda
函数的元组。因此,正确的模仿应该是:

dict_items([('Rubidium(Rb)', 37), ('Lithium(Li)', 2), ('Argon(Ar)', 18), ('Sodium(Na)', 11), ('Potassium(K)', 19), ('Hydrogen(H)', 1)])

AtmNum = [('Rubidium(Rb)', 37), ('Lithium(Li)', 2), ('Argon(Ar)', 18), ('Sodium(Na)', 11), ('Potassium(K)', 19), ('Hydrogen(H)', 1)]
f = lambda x:x[0]
print(f(AtmNum))
输出:

AtmNum = [('Rubidium(Rb)', 37), ('Lithium(Li)', 2), ('Argon(Ar)', 18), ('Sodium(Na)', 11), ('Potassium(K)', 19), ('Hydrogen(H)', 1)]
f = lambda x:x[0]
print(f(AtmNum[0]))  #  passing the first tuple

为什么排序后要转换为
dict
sort\u atomicNumber=dict(已排序(…)
导致数据再次被取消排序

您可以使用
collection.OrderedDict

Rubidium(Rb)
输出是

import collections
data = {
    'Rubidium(Rb)': 37,
    'Lithium(Li)': 2,
    'Argon(Ar)': 18,
    'Sodium(Na)': 11,
    'Potassium(K)': 19,
    'Hydrogen(H)': 1,
}

sorted_by_key = collections.OrderedDict(
    sorted(data.items()))
print(sorted_by_key)

sorted_by_val = collections.OrderedDict(
    sorted(data.items(), key=lambda x: x[1]))
print(sorted_by_val)
当您希望按键排序时,不需要使用
key=lambda…
进行排序()
,因为
dict.items()
返回的数据已经包含前面的键。

OrderedDict([('Argon(Ar)', 18), ('Hydrogen(H)', 1), ('Lithium(Li)', 2), ('Potassium(K)', 19), ('Rubidium(Rb)', 37), ('Sodium(Na)', 11)])
OrderedDict([('Hydrogen(H)', 1), ('Lithium(Li)', 2), ('Sodium(Na)', 11), ('Argon(Ar)', 18), ('Potassium(K)', 19), ('Rubidium(Rb)', 37)])
lambda中用作排序键的x是由
.items()
生成的
(键,值)
元组。正如您在实验中所注意到的,
.items()
生成这些元组的(iterable)列表,
sorted
通过对列表应用lambda来迭代并检查每个元素的顺序。因此,在第一个示例中,lambda引用了使用
.items()
创建的iterable的元素

与此相反,在第二个示例中:

sort_atomicNumber = dict(sorted(atomicNumber.items(), key = lambda x: x[0]))

x
现在是整个列表,因此合理地说,
x[0]
引用了它的第一个元素。

dict
类型可能根本不保留项目顺序。排序后不应将元组列表转换为
dict
。(如果需要dict样式的结构,请查看
collections.OrderedDict


排序中的Lambda获取可排序序列的每个元素并返回排序键(可比较值)。在这种情况下,
items()
返回dict中的“元组列表”(键,值),并且
lambda x:x[0]
返回每对中的第一个元素(键)。

但是atomicNumber.items()生成了一个包含元组(键,值)的列表。。。它不是很像[(k1,v1),(k2,v3,(k3,v3)…]吗?x[0]应该给我们第一个元组(k1,v1)!!@AdarshNamdev我刚才添加了更多关于传递给lambda函数的内容的解释。为什么排序后要转换为
dict
sort\u atomicNumber=dict(排序(…)
现在它是未排序的again@Ralf,把它转换成一个dict,我会得到:[('Ar(Ar)'18),('Hydrogen(H)'1),('Li(Li)'2),('Kalium(K)'19),('Rubidium(Rb)'37),('Na(Na)'11)],我希望它是一个按键排序的字典。{'Ar Ar(Ar)'18,'Hydrogen(H)'1,'Li(Li)'2,'Kalium(K)“:19,'铷(Rb)':37,'钠(Na)':11}感谢@Ralf提出了一个新的很酷的东西。因此,在这里,字典得到了排序的w.r.t键。如果我需要对它的w.r.t值进行排序,例如,{'氢':1,'锂':2。'钠':11…”
AtmNum = [('Rubidium(Rb)', 37), ('Lithium(Li)', 2), ('Argon(Ar)', 18), ('Sodium(Na)', 11), ('Potassium(K)', 19), ('Hydrogen(H)', 1)]
f = lambda x:x[0]
print(f(AtmNum))