python排序方法中的键如何使用列表

我是 Python 的新手。我看到了下面的代码,但不明白如何使用“列表”对字符串进行排序。


    lookup = defaultdict(list)

    ## Filling the lookup

    #  .....

    #  .....

    inputs = ['abc', 'acb', 'acb'] # a list of strings

    result = ''.join(sorted(inputs[0], key=lookup.get))

我不明白的是最后一行是关键部分。我知道它会根据列表中的值进行字典排序。如果有人可以解释它或将此步骤分解为更具可读性的解决方案,我将不胜感激。


例如,如果查找表如下所示:


   {'a' : [-3, 0, 0], 'b': [0, -1, -2], 'c': [0, -2, -1]}

那么结果将是这样acb


MMTTMM
浏览 117回答 3
3回答

浮云间

key的参数意味着sorted“假装值是这个函数的结果而不是实际值。” 所以当你用'abc'你给的查找表排序时,它会这样做:                # [1st, 2nd, 3rd] sort orderlookup.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 ).

慕的地8271018

假设你有一个动物列表:>>> 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 redef 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']

GCT1015

所以根据你的例子,假设你有以下内容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 functionresult = ''.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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python