3 回答

TA貢獻1829條經驗 獲得超4個贊
key的參數意味著sorted“假裝值是這個函數的結果而不是實際值。” 所以當你用'abc'你給的查找表排序時,它會這樣做:
# [1st, 2nd, 3rd] sort order
lookup.get('a') # [ -3, 0, 0]
lookup.get('b') # [ 0, -1, -2]
lookup.get('c') # [ 0, -2, -1]
然后它將計算出上述值的排序順序。列表按字典順序排序,這意味著首先比較第一個元素,就像在字典中一樣(“aardvark”出現在“beaver”之前,也出現在“ant”之前)。
查看第一個元素 (-3, 0, 0) 后,我們知道 'a' 具有最小值,但我們不知道 'b' 和 'c' 中哪個較小。但是一旦我們看到第二個元素 (0, -1, -2),我們就知道 'c' 更小,所以最終的順序是 'acb' 而無需咨詢第三個元素 (0, -2, -1 ).

TA貢獻1796條經驗 獲得超4個贊
假設你有一個動物列表:
>>> animals=['aarvark','zebra','giraffe','bear','dog','cat','badger','ant']
按字典順序或按字母順序排序,aardvark排在ant之前,并且都排在zebra之前:
>>> sorted(animals)
['aarvark', 'ant', 'badger', 'bear', 'cat', 'dog', 'giraffe', 'zebra']
現在假設您 10 歲的孩子告訴您,我希望所有以“b”開頭的動物首先排序,然后是“z”,然后按字母順序排序。
使用key function,這很容易完成:
>>> lookup=['b','z']
>>> key_func=lambda s: (lookup.index(s[0]),s) if s[0] in lookup else (len(lookup),s)
>>> sorted(animals, key=key_func)
['badger', 'bear', 'zebra', 'aarvark', 'ant', 'cat', 'dog', 'giraffe']
在將關鍵函數添加到 Python 排序例程之前,解決此類問題的常用方法稱為修飾、排序、取消修飾,可以在這里看到:
>>> ts=sorted([(lookup.index(s[0]),s) if s[0] in lookup else (len(lookup), s) for s in animals])
>>> ts
[(0, 'badger'), (0, 'bear'), (1, 'zebra'), (2, 'aarvark'), (2, 'ant'), (2, 'cat'), (2, 'dog'), (2, 'giraffe')]
>>> [t[1] for t in ts]
['badger', 'bear', 'zebra', 'aarvark', 'ant', 'cat', 'dog', 'giraffe']
(順便說一句:如果你使用字典而不是列表,這個例子會更容易和更快:
>>> lookup={'b':0, 'z':1}
>>> sorted(animals, key=lambda s: (lookup.get(s[0], len(lookup)),s))
['badger', 'bear', 'zebra', 'aarvark', 'ant', 'cat', 'dog', 'giraffe']
這是正確的方法,但你的問題涉及列表查找......)
關鍵函數允許您修改排序順序的解釋方式。再舉一個例子,考慮是否要按排序字符串中找到的整數排序,然后按字母順序排序。
這是列表:
>>> nl=['zebra65','ant101','bear5','no num', '2 num first', 's with 1 and 2']
如果你只是使用默認值,它會以 ASCIIbet 方式出現:
>>> sorted(nl)
['2 num first', 'ant101', 'bear5', 'no num', 's with 1 and 2', 'zebra65']
使用簡單的正則表達式和鍵函數,您可以找到所有數字并形成一個元組以按數字然后按字符串排序:
import re
def find_n(s):
ml=re.findall(r'(\d+)', s)
if ml:
return tuple(map(int, ml))+(s,)
return (0,s)
>>> sorted(nl, key=find_n)
['no num', 's with 1 and 2', '2 num first', 'bear5', 'zebra65', 'ant101']

TA貢獻1827條經驗 獲得超4個贊
所以根據你的例子,假設你有以下內容
lookup = defaultdict(list)
lookup['a'] = [-3, 0, 0]
lookup['b'] = [0, -1, -2]
lookup['c'] = [0, -2, -1]
inputs = ['abc', 'acb', 'acb'] # a list of strings
# note that the key params of sort usually takes a function
result = ''.join(sorted(
inputs[0], # this is the first value 'abc' of the input list
key=lookup.get # passing in lookup.get()
))
排序函數傳入字符串的每個值'abc'
lookup.get(a) # first
lookup.get(b) # next
lookup.get(c) # next
要理解比較邏輯,它是大多數數據結構的內部,您可以為自定義類實現您的邏輯,__lt__小于 . __gt__比...更棒
class my_int(int):
def __lt__(a,b):
return (a % b) % 2 != 0
def __gt__(a,b):
return (a % b) % 2 == 0
添加回答
舉報