将JavaScript .sort()转换为Python sorted():如何将JS中的回调转换为Python中的键

wyyhbhjk  于 2023-01-08  发布在  Python
关注(0)|答案(2)|浏览(198)

我正在处理一个问题,希望根据条件对事物进行排序。我有一个单词数组和一个哈希表,哈希表包含每个单词在单词数组中出现的次数。这个问题要求你根据每个单词在初始单词数组中出现频率的降序返回元素(最频繁的单词出现在最前面,最不频繁的单词出现在最后)。
但是,如果两个单词出现的次数相同,则在返回数组中按字母顺序(词法)排序。在JavaScript中,我可以这样写:

`let frequentWords = Object.keys(hash).sort((a, b) => {
    if (hash[b] === hash[a]) {
        return a.localeCompare(b);
    } else {
        return hash[b] - hash[a];
    }
});`

我想知道如何在Python中使用sorted(list,key = lambda x:(some function here))来编写这个函数,但是我不确定如何编写,我想能够基于多个条件对将来需要排序的任何问题进行排序,但是我不确定如何为key编写一个可以接受多个条件的lambda函数。
我认为这是一个解决办法:第一个月
我试着阅读文档,但我不确定它是如何工作的,也不确定如果我需要基于三个条件排序该怎么做,尽管这在JS回调函数中很容易做到,但我不确定Python的语法。
我正在用Python3编写代码,cmp已经不存在了,所以我想弄清楚如何只使用key参数编写代码。
谢谢!

z2acfund

z2acfund1#

JavaScript sort函数提供了两个比较项,而Python sorted函数只为lambda提供了一个比较项。
Python函数的设计是为了一个特殊的目的:把要比较的项作为输入,并产生一个值(键),这个值可以用来与其他项进行比较。
参见:
https://docs.python.org/3/glossary.html#term-key-function
https://docs.python.org/3/library/functions.html?highlight=sorted#sorted
freq_words = sorted(hash, key=lambda x: (-hash[x],x))的工作原理如下:
1.将hash的每个键作为x传递给lambda。
1.返回一个元组,该元组包含与键x对应的值的负数和键本身。
1.从每个x生成的元组由Python进行内部比较。
在元组比较中,比较两个元组各自的第一项。如果它们相等,则比较下一个相应的项,依此类推,直到出现不等式,或者没有更多的项。
See: https://docs.python.org/3/howto/sorting.html#decorate-sort-undecorate
负号导致降序排序发生--对数字的一种攻击。虽然解决方案有效,但它使用了非常Python特定的语法,因此非常抽象和不可读。
一种性能可能较低但可读性更强的排序方法是:

alpha_sorted = sorted(hash.keys()) # Sort alphabetically
freq_words = sorted(alpha_sorted, key=lambda x: hash[x], reverse=True) # Sort with key

这是因为Python排序是稳定的。
https://docs.python.org/3/howto/sorting.html#sort-stability-and-complex-sorts
What is stability in sorting algorithms and why is it important?

cu6pst1q

cu6pst1q2#

实际上,lambda函数从hash中的每个键、值对构造元组,并对它们进行排序。
因此,例如,如果您有:hsh = {'a': 10, 'ba': 8, 'bo': 8, 'c': 12, 'do': 12, 'da': 12},那么可以将sorted(hsh, key=lambda x: (-hsh[x], x))视为排序的等价物:[(-10, 'a'), (-8, 'ba'), (-8, 'bo'), (-12, 'c'), (-12, 'do'), (-12, 'da')]
元组是按元素进行比较的,所以-12排在前面,然后比较排序后的'c'、' do '和' da ':"c",da "," do ",所以我们的第一个元素是[(-12, 'c'), (-12, 'da'), (-12, 'do')]或分别在索引3、5和4处的元素,所以最终输出元素是在索引3、5和4处的原始键,即['c', 'da', 'do', ...]
如果要添加更多条件,例如:hsh = {'a': (10, 12), 'bo': (10, 14), 'ba': (10, 14)}(也许第一个数字是维基百科上的计数,第二个是某个文本语料库中的计数,你想按以下顺序排序:第二个数字,然后是第一个,然后按字母顺序,你可以这样做:sorted(hsh, key=lambda x: (-hsh[x][1], -hsh[x][0], x)).
希望这足以让您从这里进行概括!

相关问题