第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

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

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

MMTTMM 2023-02-15 16:08:10
我是 Python 的新手。我看到了下面的代碼,但不明白如何使用“列表”對(duì)字符串進(jìn)行排序。    lookup = defaultdict(list)    ## Filling the lookup    #  .....    #  .....    inputs = ['abc', 'acb', 'acb'] # a list of strings    result = ''.join(sorted(inputs[0], key=lookup.get))我不明白的是最后一行是關(guān)鍵部分。我知道它會(huì)根據(jù)列表中的值進(jìn)行字典排序。如果有人可以解釋它或?qū)⒋瞬襟E分解為更具可讀性的解決方案,我將不勝感激。例如,如果查找表如下所示:   {'a' : [-3, 0, 0], 'b': [0, -1, -2], 'c': [0, -2, -1]}那么結(jié)果將是這樣acb
查看完整描述

3 回答

?
浮云間

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超4個(gè)贊

key的參數(shù)意味著sorted“假裝值是這個(gè)函數(shù)的結(jié)果而不是實(shí)際值?!?所以當(dāng)你用'abc'你給的查找表排序時(shí),它會(huì)這樣做:


                # [1st, 2nd, 3rd] sort order

lookup.get('a') # [ -3,   0,   0]

lookup.get('b') # [  0,  -1,  -2]

lookup.get('c') # [  0,  -2,  -1]

然后它將計(jì)算出上述值的排序順序。列表按字典順序排序,這意味著首先比較第一個(gè)元素,就像在字典中一樣(“aardvark”出現(xiàn)在“beaver”之前,也出現(xiàn)在“ant”之前)。


查看第一個(gè)元素 (-3, 0, 0) 后,我們知道 'a' 具有最小值,但我們不知道 'b' 和 'c' 中哪個(gè)較小。但是一旦我們看到第二個(gè)元素 (0, -1, -2),我們就知道 'c' 更小,所以最終的順序是 'acb' 而無(wú)需咨詢(xún)第三個(gè)元素 (0, -2, -1 ).


查看完整回答
反對(duì) 回復(fù) 2023-02-15
?
慕的地8271018

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個(gè)贊

假設(shè)你有一個(gè)動(dòng)物列表:


>>> animals=['aarvark','zebra','giraffe','bear','dog','cat','badger','ant']

按字典順序或按字母順序排序,aardvark排在ant之前,并且都排在zebra之前:


>>> sorted(animals)

['aarvark', 'ant', 'badger', 'bear', 'cat', 'dog', 'giraffe', 'zebra']

現(xiàn)在假設(shè)您 10 歲的孩子告訴您,我希望所有以“b”開(kāi)頭的動(dòng)物首先排序,然后是“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']

在將關(guān)鍵函數(shù)添加到 Python 排序例程之前,解決此類(lèi)問(wèn)題的常用方法稱(chēng)為修飾、排序、取消修飾,可以在這里看到:


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

(順便說(shuō)一句:如果你使用字典而不是列表,這個(gè)例子會(huì)更容易和更快:


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

這是正確的方法,但你的問(wèn)題涉及列表查找......)


關(guān)鍵函數(shù)允許您修改排序順序的解釋方式。再舉一個(gè)例子,考慮是否要按排序字符串中找到的整數(shù)排序,然后按字母順序排序。


這是列表:


>>> nl=['zebra65','ant101','bear5','no num', '2 num first', 's with 1 and 2']

如果你只是使用默認(rèn)值,它會(huì)以 ASCIIbet 方式出現(xiàn):


>>> sorted(nl)

['2 num first', 'ant101', 'bear5', 'no num', 's with 1 and 2', 'zebra65']

使用簡(jiǎn)單的正則表達(dá)式和鍵函數(shù),您可以找到所有數(shù)字并形成一個(gè)元組以按數(shù)字然后按字符串排序:


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


查看完整回答
反對(duì) 回復(fù) 2023-02-15
?
GCT1015

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超4個(gè)贊

所以根據(jù)你的例子,假設(shè)你有以下內(nèi)容


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

         ))

排序函數(shù)傳入字符串的每個(gè)值'abc'


lookup.get(a) # first 

lookup.get(b) # next 

lookup.get(c) # next 

要理解比較邏輯,它是大多數(shù)數(shù)據(jù)結(jié)構(gòu)的內(nèi)部,您可以為自定義類(lèi)實(shí)現(xiàn)您的邏輯,__lt__小于 . __gt__比...更棒


class my_int(int):

   def __lt__(a,b):

       return (a % b) % 2 != 0

   def __gt__(a,b):        

       return (a % b) % 2 == 0


查看完整回答
反對(duì) 回復(fù) 2023-02-15
  • 3 回答
  • 0 關(guān)注
  • 140 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)