Как изменить значения вложенного списка без его выравнивания? - PullRequest
1 голос
/ 21 марта 2020

Предположим, у меня есть два списка. Обычный список и вложенный список с номерами, которые являются индексами другого списка, например так:

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

Как изменить все индексы в myindexes на элементы с mylist с этими индексами ? без сплющивания myindexes?

Например:

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

Обратите внимание, что это регулярно-вложенный список.

Я пробовал это:

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

, но список выравнивается:

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

Ответы [ 2 ]

1 голос
/ 21 марта 2020

Измените порядок циклов и вложите списки в соответствии с вложенностью 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 голос
/ 21 марта 2020

Простой подход был бы:

>>> [[[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']]]

Или вот,

>>> [[[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']]]

Если вы хотите попробовать numpy, np.vectorize:

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

Или np.take

>>> np.take(mylist, myindexes).tolist()
[[['hi', 'hello'], ['bye', 'cya']],
 [['hi', 'bye'], ['hello', 'cya']],
 [['hi', 'cya'], ['hello', 'bye']]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...