Как изменить положение элементов в списке - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть матрица перестановок, представляющая собой квадратную матрицу и элементы либо 1, либо 0.

p = [[1, 0, 0, 0],
     [0, 0, 1, 0],
     [0, 1, 0, 0],
     [0, 0, 0, 1]]

Если я умножу p на список int, положение элементов в списке будет изменено. Например

a_num = [1, 3, 2, 4]
np.dot(np.array(p), np.array(a_num).reshape(4,1))
# results is [1, 2, 3, 4]

Теперь я хочу изменить список str:

a_str = ['c1', 'c3', 'c2', 'c4']

до

['c1', 'c2', 'c3', 'c4']

Вы знаете, как этого добиться с помощью матрицы p? Обратите внимание, что мое реальное приложение может содержать в списке десятки элементов.

Для вашей информации. Есть пост о Как генерировать матрицу перестановок на основе двух списков стр.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Вы можете сделать это без numpy, используя перечисление в понимании списка:

p = [[1, 0, 0, 0],
     [0, 0, 1, 0],
     [0, 1, 0, 0],
     [0, 0, 0, 1]]

a_str = ['c1', 'c3', 'c2', 'c4']

b_str = [a_str[idx] for row in p for idx,i in enumerate(row) if i == 1]

print(b_str)

Выход:

 ['c1', 'c2', 'c3', 'c4']

Он принимает каждый внутренний список p и использует элемент a_str в idx этого внутреннего списка, который равен единице, создавая тем самым новый список.

0 голосов
/ 01 ноября 2018

Вы можете использовать numpy.take:

>>> numpy.take(numpy.array(a_str), numpy.array(a_num)-1)
array(['c1', 'c2', 'c3', 'c4'], dtype='|S2')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...