Mit index () auf mehrdimensionalen listen

Für eine eindimensionale Liste wird der Index eines Elements wie folgt gefunden:

a_list = ['a', 'b', 'new', 'mpilgrim', 'new'] a_list.index('mpilgrim') 

Was ist das Äquivalent für eine 2 oder n-dimensionale Liste?

Edit: Ich habe ein Beispiel hinzugefügt, um zu klären: Wenn ich eine dreidimensionale Liste wie folgt habe

 b_list = [ [1,2], [3,4], [5,6], [7,8] ], [ [5,2], [3,7], [6,6], [7,9] ] 

Jetzt sagen wir, dass ich einen bestimmten Wert in dieser Liste identifizieren möchte. Wenn ich den Index der 1. und 2. Dimesion kenne, aber nicht den Null-ten Index für den Wert kenne, den ich will, wie gehe ich über den Null-Index?

Wäre es so was:

  target_value = 7 b_list[0].index(target_value) 

Wenn die Ausgabe eine Ganzzahl ist: 0

6 Solutions collect form web for “Mit index () auf mehrdimensionalen listen”

Eine mehrdimensionale Liste ist einfach eine Liste mit mehr Listen im Inneren davon. Also seine Indizes würden Listen selbst sein.

 a = [[1, 2, 3], [2, 3, 4], [3, 4, 5]] print a.index([2, 3, 4]) # prints 1 

Für zweidimensionale Liste; Sie können über Zeilen iterieren und mit .index-Funktion für die Suche nach Artikel:

 def find(l, elem): for row, i in enumerate(l): try: column = i.index(elem) except ValueError: continue return row, column return -1 tl = [[1,2,3],[4,5,6],[7,8,9]] print(find(tl, 6)) # (1,2) print(find(tl, 1)) # (0,0) print(find(tl, 9)) # (2,2) print(find(tl, 12)) # -1 

Ich weiß nicht von einem automatischen Weg, es zu tun, aber wenn

a = [[1,2],[3,4],[5,6]]

Und du möchtest den Ort von 3 finden, kannst du:

x = [x for x in a if 3 in x][0]

print 'The index is (%d,%d)'%(a.index(x),x.index(3))

Die Ausgabe ist:

The index is (1,0)

Für mehrdimensionale Arrays:

 def find(needle,haystack): if needle == haystack: return [] # Strings are iterable, too if isinstance(haystack,str) and len(haystack)<=1: return None try: for i,e in enumerate(haystack): r = find(needle,e) if r is not None: r.insert(0,i) return r except TypeError: pass return None ml = [[1,2,3],[4,5,6],[7,8,9]] print find(2,ml) ml = [3,[[1,2,3],[4,5,6],[7,8,9]]] print find(2,ml) ml = [[["ab", "bc", "cde"]]] print find("d",ml) 

Es sollte ein besserer Weg sein, um den Versuch / außer Block zu vermeiden, aber ich konnte nicht einen finden: In Python, wie kann ich feststellen, ob ein Objekt iserable ist?

Für n-dimensionale rekursive Suche können Sie so etwas ausprobieren:

 from copy import copy def scope(word, list, indexes = None): result = [] if not indexes: indexes = [] for index, item in enumerate(list): try: current_index = indexes + [index] result.append(current_index + [item.index(word)]) except ValueError: pass if type(item[0]) == type([]): indexes.append(index) result.extend(scope(word, item, copy(indexes))) return result 

Und das Ergebnis ist:

 >>> d_list = [['a', 'b', 'new', 'mpilgrim', 'new'], [['a', 'b', 'new', 'mpilgrim', 'new'], ['b', 'd', 'new', 'mpilgrim', 'new']]] >>> word = 'mpilgrim' >>> result = scope(word, d_list) [[0, 3], [1, 0, 3], [1, 1, 3]] 

Wahrscheinlich gibt es bessere Möglichkeiten, es zu tun, aber das ist die, die ich herausgefunden habe, ohne irgendeine Bibliothek zu bekommen.

EDIT: Eigentlich war es nicht perfekt und eine Bibliothek muss hinzugefügt werden. Es ist Kopie. Jetzt ist es ok.

Sie können auch die folgende Beispielmethode verwenden:

 data = [[1, 1,2],[12,4],[6]] def m_array_index(arr, searchItem): for i,x in enumerate(a): for j,y in enumerate(x): if y == searchItem: return i,j return -1,-1#not found print m_array_index(data, 6) 

Oder mit allen Vorkommnissen (sicherer Code könnte optimiert werden – modifiziert, um mit Generatoren zu arbeiten und so weiter – aber hier ist nur ein Beispiel):

 occurrences = lambda arr, val: tuple((i,j) for i,x in enumerate(arr) for j,y in enumerate(x) if y == val) or ((-1,-1)) print occurrences(data, 1) # ((0, 0), (0, 1)) print occurrences(data, 12) # ((1, 0),) print occurrences(data, 11) # (-1, -1) 
Python ist die beste Programmiersprache der Welt.