Python: постоянное вычитание по элементам списка для возврата списка

#python-3.x #list #element

#python-3.x #Список #элемент

Вопрос:

У меня есть список decay_positions = [0.2, 3, 0.5, 5, 1, 7, 1.5, 8] , и я хочу, чтобы список был таким, чтобы

 new_position = 2 - decay_positions
  

По сути, я хочу новый список, где его элементы равны 2, вычитаемым по элементам из decay_positions
Однако, когда я делаю:

 decay_positions = [0.2, 3, 0.5, 5, 1, 7, 1.5, 8]
print(2 - decay_positions)
  

Я получаю

 TypeError: unsupported operand type(s) for -: 'int' and 'list'
  

Итак, я подумал, может быть, если размеры не совпадают, вы можете вычесть. Итак, я сделал

 decay_positions = [0.2, 3, 0.5, 5, 1, 7, 1.5, 8]
print([2]*len(decay_positions) - decay_positions)
  

но это все равно дает TypeError: unsupported operand type(s) for -: 'int' and 'list'

несмотря на то, что [2]*len(decay_positions) и decay_positions имеют одинаковый размер. Итак, мысли? Не должно ли поэлементное вычитание быть довольно простым?

Ответ №1:

Используйте numpy ftw:

 >>> import numpy as np
>>> decay_positions = np.array([0.2, 3, 0.5, 5, 1, 7, 1.5, 8])
>>> 2 - decay_positions
array([ 1.8, -1. ,  1.5, -3. ,  1. , -5. ,  0.5, -6. ])
  

Если вы по какой-то причине презираете numpy, вы всегда можете использовать понимание списка в качестве дополнительного варианта:

 >>> [2-dp for dp in [0.2, 3, 0.5, 5, 1, 7, 1.5, 8]]
[1.8, -1, 1.5, -3, 1, -5, 0.5, -6]
  

Комментарии:

1. ffs итак, все, что мне нужно было сделать, это использовать numpy

Ответ №2:

Вы можете сделать это:

 decay_positions = [0.2, 3, 0.5, 5, 1, 7, 1.5, 8]
result = [2-t for t in decay_positions]
print(result)
  

Ответ №3:

Попробуйте

 decay_positions = [0.2, 3, 0.5, 5, 1, 7, 1.5, 8]
new_decay_positions = [2-pos for pos in decay_positions ]
  

Ответ №4:

Я просто хочу добавить, что если вы хотите изменить список на месте, вы можете сделать

 decay_positions = [0.2, 3, 0.5, 5, 1, 7, 1.5, 8]
decay_positions[:] = (2 - it for it in decay_positions)
print(decay_positions)