2016-11-01 1 views
0

Ich muss eine Funktion schreiben, die ein Tupel im Format ('Buchstabe', Zeile, Spalte) aller Buchstaben in einer Liste von Listen erstellt. Ich erkannte, dass ich zwei Funktionen kombinieren konnte, die ich bereits geschrieben habe, um dies zu erreichen. Eine Funktion, die ich geschrieben habe, get_letters (lst) extrahiert alle Buchstaben aus der Liste der Listen und die andere, die ich geschrieben habe, extrahiert die Zeile und die Spalte.Tupel des Buchstabens und seine Zeile und Spalte in der Liste der Listen erstellen

Es muss einen Weg geben, diese beiden Funktionen zu kombinieren, um dieses Ziel zu erreichen, ohne ein neues zu erstellen, aber ich bin nicht sicher, wie ich es tun würde. Hier ist der Code für diese beiden Funktionen:

def get_letters(lst): 
    letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' 
    newlst = [] 

    for sublist in lst: 
     for i in sublist: 

      if i in symbols and i not in newlst: 
       newlst.append(i) 

      #Example output: (1, 0) 

    return newlst 

def find_letter(letter, lst): 
    for i in range(len(lst)): 
     for j in lst[i]: 
      if j == letter: 
       return i ,lot[i].index(j) 

     #Example output: ['A'] 

     #New function example output: [('A', 1, 0)] 

     #Example input for both above functions: lst2 = 
       #[['.','M','M','H','H'], 
       #['A','.','.','.','f'], 
       #['B','C','D','.','f']] 
+1

'enumerate' wird wahrscheinlich tun, was beide Funktionen derzeit tun. Sie sollten eine Beispieleingabe und erwartete Ausgabe zeigen –

+0

Gibt es einen Weg ohne aufzuzählen? Nur eine Beispieleingabe für beide Funktionen und die neue hinzugefügt – n00bprogrammer22

Antwort

1

Wie bereits erwähnt, enumerate ist definitiv der Weg hier zu gehen. Ihre erste Funktion tut nicht wirklich viel und die zweite nutzt keine nützlichen Python-Funktionen.

folgender Ausschnitt wird die erste Instanz eines Briefes in der Liste der Listen und zurück ihren Zeilen- und Spaltenindex finden:

Hinweis
lot2 =  [['.','M','M','H','H'], 
       ['A','.','.','.','f'], 
       ['B','C','D','.','f']] 

>>> print(letter_find('A', lot2)) 
('A', 1, 0) 

, dass dies tut:

def letter_find(letter, lst): 
    for y, row in enumerate(lst): 
     if letter in row: 
      return letter, y, row.index(letter) 

wie folgt verwendet nicht überprüfen, ob die Eingabe tatsächlich ein Buchstabe ist. Wenn Sie wollen nur einen Brief annehmen, können Sie so etwas wie dieses an die Spitze der Funktion hinzu:

if not letter.isalpha(): 
    raise ValueError('Only letters are accepted') 
-1
[(letter, i, j) for i, sublist in enumerate(list_of_list) for j, letter in enumerate(sublist) if letter.isalpha()] 

ist eine Möglichkeit, es mit enumerate zu tun. Wenn Sie nicht enumerate aus irgendeinem Grund verwenden können, können Sie einfach Ihre eigene Rolle:

def not_enumerate_i_swear(iterable): 
    i = 0 
    for item in iterable: 
     yield (i, item) 
     i += 1 
+0

Aus irgendeinem Grund funktioniert das nicht. Ich schätze, ich sollte eigentlich eine Liste von Tupel-Listen zurückgeben, und die Tupel sind nur das erste Vorkommen jedes Buchstabens und nicht nur ein Tupel. Ich kann nicht das not_enumerate erhalten, um richtig zu funktionieren, es gibt ein Tupel mit 0 im ersten Punkt und jedem Zeichen in der Liste im zweiten Punkt zurück. – n00bprogrammer22

Verwandte Themen