为什么lambda函数从目录项()和元组列表不同?

2024-10-06 12:42:05 发布

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

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)

我正试着用钥匙把字典分类。如果我像上面那样使用lambda表达式,排序就起作用了。但在这里,当我使用符号x[0]时,我感到困惑。为了按键名排序,不是应该是x[0][0]吗???你知道吗

我可以看到目录项()看起来类似于元组列表,那么为什么在排序时x[0]返回string对象,而在下面的元组列表'AtmNum'中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))

输出: (‘铷(Rb)’,37)


Tags: lambda排序liar元组narblithium
3条回答

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

lambda中用作排序键的x是由.items()生成的(key, value)元组。正如您在实验中注意到的,.items()生成这些元组的(iterable)列表,sorted通过对每个元素应用lambda来迭代列表并检查其顺序。因此,在第一个示例中,lambda引用了用.items()创建的iterable的元素。你知道吗

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

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))

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

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

当您试图模仿它时,您将dict_items作为参数传递给lambda函数,而在sorted函数中,dict_items内的tuple就是传递给lambda函数的那些。所以,正确的模仿应该是这样的:

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

输出:

Rubidium(Rb)

为什么排序后要转换为dictsort_atomicNumber = dict(sorted(...))导致数据再次被取消排序。你知道吗

您可以改用collection.OrderedDict

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)

输出为

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)])

当您希望按键排序时,不需要对key=lambda...使用sorted(),因为dict.items()返回的数据已经包含前面的键。你知道吗

相关问题 更多 >