2016-05-16 3 views
5

Ich möchte diese Elemente von list1 ersetzen, deren Indizes in der Liste indices von list2 Elemente gespeichert sind. Im Folgenden ist der aktuelle Code:Python ein Liner zum Ersetzen einer Liste Indizes

j=0 
for idx in indices: 
    list1[idx] = list2[j] 
    j+=1 

Ist es möglich, einen Einzeiler für die oben genannten vier Zeilen schreiben mit Lambda-Funktion oder Liste Verständnis?

EDIT
list1 enthält Schwimmer
list2 enthält float Werte
indices ganze Zahlen zwischen 0 und len(list1)

+0

Nein, Listenkomprehensionen nicht vorhandene Listen ändern. –

+2

Können Sie ein Beispiel geben, was 'list1',' list2' und 'incides' enthalten würde? –

+0

@MorganThrapp Die Option zum Erstellen einer neuen Liste ist * open *! – vvy

Antwort

4

Verwenden Sie conditional expressions ,

# A test case 
list1 = [0, 1, 2, 3, 4, 5, 6] 
list2 = ['c', 'e', 'a'] 
indices = [2, 4, 0] 

# Use conditional expressions 
new_list = [list2[indices.index(idx)] if idx in indices else v for idx, v in enumerate(list1)] # idx2 = indices.index(idx), for list2 

print(new_list) 
# Output 
['a', 1, 'c', 3, 'e', 5, 6] 
+0

Hallo, das scheint nicht richtig zu sein. Warum wählen Sie 'idx' Eintrag von' list2'? Der Eintrag 'list1 [idx] 'wird durch' list2' Einträge ersetzt (seriell). – vvy

+0

@vvy, thx, ich habe meine Antwort mit einem Beispiel bearbeitet. Das Ergebnis stimmt mit dem ursprünglichen Code überein. – SparkAndShine

2

Es ist nicht so schön, aber man könnte es so lösen enthalten Werte:

map(list1.__setitem__, indices, list2) 
+1

Sie würden sagen, dass es in Python 3 nicht funktioniert. – vaultah

+0

Obwohl clever, kann PEP 20 einwenden. – boardrider

+0

Ich stimme euch zu, aber OP fragte nach einem "One Liner", ich lieferte es :) – zoubida13

3

Obwohl es kein Motto, hier ist eine Alternative, die ich denke, besser lesbar ist:

for i, v in zip(indices, list2): 
    list1[i] = v 
+0

und natürlich, wenn Sie 'list1 [i] = v' auf dieselbe Zeile wie die' for' Schleife legen, dann wäre es 1 Zeile, das ist definitiv die sauberste Antwort! –

Verwandte Themen