我正在做一個 CodeWars kata ( Strings mix ) 并且出現錯誤。我寫了以下代碼:
def mix(s1, s2):
whitelist = set('abcdefghijklmnopqrstuvwxyz')
out = []
s1 = ''.join(sorted((c for c in s1 if c in whitelist), key = lambda c: (-s1.count(c), c)))
s2 = ''.join(sorted((c for c in s2 if c in whitelist), key = lambda c: (-s2.count(c), c)))
groups = sorted(list(set(s1) | set(s2)), key = lambda c: (-max([s1.count(c), s2.count(c)]), lambda v: 1 if (s1.count(v) > s2.count(v)) else 2, c))
for i in groups:
if max([s1.count(i), s2.count(i)]) <= 1:
continue
if s1.count(i) == s2.count(i):
out.append('=:' i * s1.count(i))
continue
if s1.count(i) > s2.count(i):
out.append('1:' i * s1.count(i))
continue
else:
out.append('2:' i * s2.count(i))
return '/'.join(out)
第 6 行 ( groups = sorted...) 的目標是根據 kata 的描述正確排序不同的單個字母。我正在使用 lambda 函式為sorted()回傳三個值的元組的方法創建鍵:
c兩個字串的最大字母數 ( ),反向排序時取反- 嘗試優先考慮
s1他們s2是否有相同數量的字母 - 如果一切都失敗了,最后按字母順序
如果這沒有意義,我建議閱讀 kata 描述。我收到錯誤訊息:
Traceback (most recent call last):
File "/workspace/default/tests.py", line 5, in <module>
test.assert_equals(mix("Are they here", "yes, they are here"), "2:eeeee/2:yy/=:hh/=:rr")
File "/workspace/default/solution.py", line 6, in mix
groups = sorted(list(set(s1) | set(s2)), key = lambda c: (-max([s1.count(c), s2.count(c)]), lambda v: 1 if (s1.count(v) > s2.count(v)) else 2, c))
TypeError: '<' not supported between instances of 'function' and 'function'
我有點困惑為什么會發生這種情況,因為我不知道如何s1.count(v)以及s2.count(v)可能是功能?
如果我嘗試訂購信件的方式完全錯誤,我不介意一些幫助。
uj5u.com熱心網友回復:
正如 Barmar 在評論中提到的,sorted當第一個標準不區分元素時,函式的第二個排序標準是比較 lambda 函式,而不是字母。Traceback 中的>符號不??是指s1.count(v) > s2.count(v),而是sorted函式嘗試根據第二個標準比較兩者,即通過將一個 lambda 函式與另一個 lambda 函式進行比較。
為了正確區分s1ands2并優先考慮s2,您的方式確實有效(同時僅保留沒有 lambda 的三元 if 陳述句,并替換v為c)。我們可以通過將事物拆分為案例來在數學上證明這一點,但我懷疑這不是您想要的。但直觀地說,它是有效的,因為您基本上是在檢查當前字母的計數是否s1是該字母的最大計數,如果是,那么您將其優先于 s2 中具有相同計數的那些,因為在這些情況下s2.count(c) > s1.count(c),因此,具有最大計數的字母s2被賦予較低的優先級。例如,給定s1 = "ttt"和s2="sss",兩者的計數相同,因此它們按第二個條件排序。s1.count("t")>s2.count("t")是True所以它的值是1 (高優先級),而s1.count("s")>s2.count("s")isFalse所以它的值是2(低優先級,因為sorted默認情況下從最小到最大排序)。
我認為可以更清晰地對第 6 行進行編碼的另一種方法(盡管有爭議)如下:
groups = sorted(list(set(s1) | set(s2)), key=lambda letter: (max(s1.count(letter),s2.count(letter)),s1.count(letter)>s2.count(letter), -ord(letter.lower())),reverse=True)
該ord函式用于將字母轉換為其 ascii 值,然后取其負數,基本上恢復被設定破壞的字母順序標準reverse=True。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/491553.html
