2016-08-19 3 views
1

Ich habe die folgenden zwei Listen:Python-Liste als Index für eine verschachtelte Liste

l1 = [2, 3, 2] 
l2 = [0, [0, 1], [0, 1, 0, [0, 1, [0, 0]]]] 

Wie kann ich die erste Liste als Baum Index verwenden, um ein Element in die zweite Liste anhängen, wie zu tun

l2[2][3][2].append(0) 
+0

Obwohl 'exec' in allgemeinen Fällen vermieden werden sollte, können Sie es einfach versuchen, völlig basierend auf Zeichenfolgenoperationen (ersetzen Sie einfach Komma durch ''] [' 'und verketten Sie mit Ihrem Befehl). – YiFei

+0

Können Sie mir bitte ein Beispiel für Ihren Vorschlag geben? Vielen Dank – Theo

+0

Ja, sicher, ich habe eine Antwort geschrieben, aber Sie sollten wissen, dass es vollständig abhängig von String und Verwendung Feature als reflektive Programmierung, die potenziell gefährlich sein kann, siehe [dieser Beitrag auf SO] (http: // stackoverflow .com/fragen/1933451/warum-sollte-exec-and-eval-vermieden werden. – YiFei

Antwort

0

dies nur tun, wenn Sie wissen, was du tust:

l1 = [2, 3, 2] 
l2 = [0, [0, 1], [0, 1, 0, [0, 1, [0, 0]]]] 

str1=repr(l1) 
str1=str1.replace(', ','][') # str1=[2][3][2] 
eval(repr(l2)+str1) # or var=exec(repr(l2)+str1) 
+0

Das wird definitiv irgendwann fehlschlagen. Z.B. wenn jemand ein Tupel als 'l1' verwendet. Oder ein numpliges Array. Oder nur Array. –

+0

Sicher, das ist also gefährlich, wie ich schon OP gewarnt habe. – YiFei

1

könnten Sie reduce Funktion:

In [1]: l1 = [2, 3, 2] 

In [2]: l2 = [0, [0, 1], [0, 1, 0, [0, 1, [0, 0]]]] 

In [3]: from functools import reduce 

In [4]: reduce(lambda l, i: l[i], l1, l2) 
Out[4]: [0, 0] 

In [5]: l2[2][3][2] 
Out[5]: [0, 0] 
3

Es gibt keinen Standard-Weg, dies zu tun, aber diese arbeiten:

from functools import reduce 
from operator import getitem 

def tree_index(tree, index): 
    return reduce(getitem, index, tree) 

tree_index(l2, l1).append(0) 

Als Bonus die tree_index Funktion funktioniert auch für Wörterbücher und alle anderen Zuordnungen. Zum Beispiel:

>>> adjs = {'apple': ['red', 'green'], 'swallow': ['african', 'european'] } 
>>> tree_index(adjs, ['apples', 0]) 
'red' 

Auf der anderen Seite, tree_index nicht für Aufgaben arbeiten. Das wird nicht funktionieren:

tree_index(l2, [1,1]) = 33 # throws SyntaxError 

Um Baumindizes Sie eine andere Funktion oder Teil Indizierung müssen zuweisen:

tree_index(l2, [1])[1] = 33 
+0

Dies ist eine sehr gute Lösung, aber YiFeis Antwort funktionierte besser für meine Situation. – Theo

1

Diese Arbeit sollte

def tree_append(tree, index_list', val=None): 
    for index in index_list: 
     tree = tree[index] 
    tree.append(val) 

l1 = [2, 3, 2] 
l2 = [0, [0, 1], [0, 1, 0, [0, 1, [0, 0]]]] 

tree_append(l2, l1, val=0) 

>> l2 
[0, [0, 1], [0, 1, 0, [0, 1, [0, 0. 0]]]] 
0

Aus irgendeinem seltsamen Grund, dachte ich sofort an eine rekursive Routine, aber im Wesentlichen ist es das tut, was Kostas tun ist, ich kann es nur einfacher zu folgen finden:

def tree_appender(tree, location, thing): 
    sub_tree_index = location.pop(0) 
    if len(location) > 0: 
     tree_appender(tree[sub_tree_index], location, thing) 
    else: 
     tree[sub_tree_index].append(thing) 
    return 


>>> l1 = [2, 3, 2] 
>>> l2 = [0, [0, 1], [0, 1, 0, [0, 1, [0, 0]]]] 
>>> python_file.tree_appender(l2, l1, "dave") 
>>> l2 
[0, [0, 1], [0, 1, 0, [0, 1, [0, 0, 'dave']]]] 

Es wird natürlich fehlschlagen, wenn l1 war [0] zum Beispiel als l2 [0] ist ein Int keine Liste. Du könntest das testen und alles, was dazu gehört, in eine Liste einfügen, wenn das wahrscheinlich ist.

Verwandte Themen