2017-06-05 4 views
0

Ich habe zwei Listen von Listen.Get Elemente einer Unterliste in Python basierend auf Indizes einer anderen Liste

Ich möchte die Elemente aus der zweiten Liste von Listen, basierend auf einem Wert aus der ersten Liste von Listen erhalten.

Ich wenn ich einfache Listen habe, alles glatt laufen, aber sobald ich Liste der Liste habe, fehlt mir etwas am Ende.

Hier ist der Code für zwei Listen arbeiten (N = Namen und V = Werte):

N = ['name 1', 'name 2','name 3','name 4','name 5','name 6','name 7','name 8','name 9','name 10'] 

V = ['val 1', 'val 2','val 3','val 4','val 5','val 6','val 7','val 8','val 9','val 10'] 

bool_ls = [] 
NN = N 
for i in NN: 
     if i == 'name 5': 
      i = 'y' 
     else: 
      i = 'n' 
     bool_ls.append(i) 

# GOOD INDEXES = GI 

GI = [i for i, x in enumerate(bool_ls) if x == 'y'] 

# SELECT THE GOOD VALUES = "GV" FROM V 

GV = [V[index] for index in GI] 

wenn ich eine Funktion definieren, arbeitet mit den beiden Listen gut angewendet:

def GV(N,V,name): 
    bool_ls = [] 
    NN = N 
    for i in NN: 
     if i == name: 
      i = 'y' 
     else: 
      i = 'n' 
     bool_ls.append(i) 
    GI = [i for i, x in enumerate(bool_ls) if x == 'y'] 
    GV = [V[index] for index in GI] 

    return GV 

Sobald ich "Liste der Liste" versuche, kann ich die ähnlichen Ergebnisse nicht erhalten. Mein Code sieht wie folgt aus:

NN = [['name 1', 'name 2','name 3'], ['name 1', 'name 2','name 3'], ['name 1', 'name 2','name 3'], ['name 1', 'name 2','name 3'], ['name 1', 'name 2','name 3'], ['name 1', 'name 2','name 3']] 

VV = [['val 1', 'val 2', 'val 3'], ['val 1', 'val 2', 'val 3'], ['val 1', 'val 2', 'val 3'], ['val 1', 'val 2', 'val 3'], ['val 1', 'val 2', 'val 3']] 


def GV(NN,VV,name): 
    bool_ls = [] 
    NNN = NN 
    for j in NNN: 
     for i in j: 
      if i == name: 
       i = 'y' 
      else: 
       i = 'n' 
      bool_ls.append(i) 

# here is where I'm lost 

Hilfe sehr geschätzt! Vielen Dank.

+1

Warum benutzen Sie nicht 'zip'? –

+0

Auch, FYI: 'NNN = NN' macht _ ** nicht _ ** eine Kopie von' NN'. –

+0

Vielen Dank für Ihren Kommentar - aber wenn ich mit deepcopy meine Ergebnisse ändere, habe ich newlist = oldlist – alc

Antwort

0

Es gibt einen einfacheren Weg zu tun, was Ihre Funktion tut, aber um Ihre Frage zu beantworten, brauchen Sie nur zwei Schleifen (eine für jede Ebene von Listen): Die erste Liste iteriert über die Liste der Listen, die zweite iteriert über die inneren Listen und macht die etwas seltsame y oder n Sache, um einen Wert zu wählen.

+0

"Es gibt einen einfacheren Weg, um zu tun, was Ihre Funktion tut" danke. Ich bin hier, um zu lernen, wenn Sie vorschlagen können, was die Methode ist, wird großartig sein. Vielen Dank. – alc

1

Sie können paarweise Kombinationen aus beiden Listen mit zip und dann Filter in einem Listenverständnis generieren.

Für die flachen Listen:

def GV(N, V, name): 
    return [j for i, j in zip(N, V) if i==name] 

Für die verschachtelten Listen, erhalten Sie eine zusätzliche Verschachtelung hinzufügen:

def GV(NN,VV,name): 
    return [j for tup in zip(NN, VV) for i, j in zip(*tup) if i==name] 

Falls Sie eine Liste von Listen wollen, können Sie die Verschachtelung bewegen in neue Listen innerhalb des Elternverständnisses.

+0

danke - Ich teste Ihre Lösung und berichte zurück. (Ich verliere mich auf meine Logik zu versuchen, zu verwenden. Zip) – alc

+0

Wenn dies für Python2 ist, wird es für große Datenmengen unhandlich werden. –

Verwandte Themen