Załóżmy, że mam dwie listy. Lista zwykła i lista zagnieżdżona z liczbami będącymi indeksami innej listy, na przykład:

>>> mylist = ['hi', 'hello', 'bye', 'cya']
>>> myindexes = [[[0, 1], [2, 3]], [[0, 2], [1, 3]], [[0, 3], [1, 2]]]

Jak zmienić wszystkie indeksy w myindexes na elementy z mylist z tymi indeksami bez spłaszczania myindexes?

Lubię to:

>>> replace_indexes_with_list_items(myindexes)
[[['hi', 'hello'], ['bye', 'cya']], [['hi', 'bye'], ['hello', 'cya']], [['hi', 'cya'], ['hello', 'bye']]]

Zauważ, że jest to regularnie zagnieżdżona lista.

Próbowałem tego:

>>> myindexes = [mylist[a] for c in myindexes for b in c for a in b]

Ale spłaszcza listę:

['hi', 'hello', 'bye', 'cya', 'hi', 'bye', 'hello', 'cya', 'hi', 'cya', 'hello', 'bye']
1
LogicalX 21 marzec 2020, 18:48

2 odpowiedzi

Najlepsza odpowiedź

Prostym podejściem byłoby:

>>> [[[mylist[i], mylist[j]], [mylist[k], mylist[l]]] for [i, j], [k, l] in myindexes]

[[['hi', 'hello'], ['bye', 'cya']],
 [['hi', 'bye'], ['hello', 'cya']],
 [['hi', 'cya'], ['hello', 'bye']]]

Albo to,

>>> [[[mylist[i3] for i3 in i2] for i2 in i1] for i1 in myindexes]
[[['hi', 'hello'], ['bye', 'cya']],
 [['hi', 'bye'], ['hello', 'cya']],
 [['hi', 'cya'], ['hello', 'bye']]]

Jeśli chcesz spróbować numpy, {{ X1}}:

>>> import numpy as np
>>> np.vectorize(mylist.__getitem__)(myindexes).tolist()
[[['hi', 'hello'], ['bye', 'cya']],
 [['hi', 'bye'], ['hello', 'cya']],
 [['hi', 'cya'], ['hello', 'bye']]]

Lub np.take

>>> np.take(mylist, myindexes).tolist()
[[['hi', 'hello'], ['bye', 'cya']],
 [['hi', 'bye'], ['hello', 'cya']],
 [['hi', 'cya'], ['hello', 'bye']]]
1
Sayandip Dutta 21 marzec 2020, 16:04

Odwróć kolejność pętli i zagnieżdżaj wyrażenia listowe, aby dopasować zagnieżdżenie myindexes:

>>> [[[mylist[a] for a in b] for b in c] for c in myindexes]
[[['hi', 'hello'], ['bye', 'cya']], [['hi', 'bye'], ['hello', 'cya']], [['hi', 'cya'], ['hello', 'bye']]]
1
John Kugelman 21 marzec 2020, 15:54