Domanda

L'istruzione if sotto ha un problema in qualche parte e non riesco a capirlo. Eventuali convenzioni o di metodo usi impropri che potrebbero causare a non funzionare a destra? lista di controllo è una frase e lis inputed utente è un grande elenco di parole.

def realCheck(checkList):  
        string = "".join(checkList)  
    print string  
    wordList = string.split()  
    if match(wordList, lis).sort(key=str.lower) == wordList.sort(key=str.lower):  
        return True  
    else:  
        return False  
È stato utile?

Soluzione

  1. Se lista di controllo è una stringa, poi ci c'è bisogno di "".join(checkList). E 'appena ti restituisce lo stesso stringa:

    In [94]: checkList="This is a sentence"    
    In [95]: "".join(checkList)
    Out[95]: 'This is a sentence'
    
  2. La prima linea, string = "".join(checkList) ha il torto indentazione. Spostare indietro per essere dilavare con le altre linee del Definizione.

  3. Do non citarne string variabile. esso sostituzioni modulo standard di Python con lo stesso nome.

  4. Presumibilmente match(wordList, lis) restituisce una lista. Il metodo di ordinamento ordina la lista, e ritorna None. Dal momento che è None == None True,

    if match(wordList, lis).sort(key=str.lower) ==  wordList.sort(key=str.lower):
    

    è sempre vero.

    Più probabilmente, ciò che si vuole è

    sorted(astr.lower() for astr in match(wordList, lis))==sorted(astr.lower() for astr in wordList)
    

    A differenza del metodo sort, il ordinato funzione restituisce la lista ordinata.

    Alex Martelli punti su,

    sorted(match(wordList, lis),key=str.lower)==sorted(wordList,key=str.lower)
    

    ha sempre lo stesso valore di verità come

    sorted(match(wordList, lis))==sorted(wordList)
    

    Quindi, utilizzando str.lower come il key per l'ordinamento (anziché come trasformazione prima di confrontare con ==) non è probabilmente quello che volete.

  5. La dichiarazione

    if condition:
        return True
    else:
        return False
    

    può essere semplificata a

    return condition
    

Altri suggerimenti

.sort, come quasi ogni altro metodo mutatore di contenitori, i rendimenti None. Quindi il confronto a.sort() a b.sort() è assurdo, perché essi saranno entrambi None! Credo che si desidera confrontare con sorted(match(wordList, lis), key=str.lower) sorted(worldList, key=str.lower).

Si noti che il key è in realtà irrilevante il modo in cui lo si usa: se le due liste hanno elementi che differiscono nel caso, saranno non confrontare uguali anche se sono ordinati "paragonabile" !

Quindi, una migliore idea potrebbe essere quella di confrontare sorted(s.lower() for s in match(wordList, lis)) con sorted(s.lower() for s in worList). Si noti che il key= è non necessari dal momento che qui si sta confrontando le in minuscolo Elementi così faranno ordinare quel modo "per natura".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top