Умножьте каждый элемент во вложенном списке на константу - PullRequest
1 голос
/ 19 июня 2019

Я читал много подобных сообщений здесь , здесь , здесь и так далее, но я не могу решить свою проблему.У меня есть список таких пар:

 my_list = [[[0, 3], [0, 0]], [[77, 94], [76, 94], [77, 93], [76, 93], [76, 90], [77, 84], [76, 88]], [[25, 31], [10, 0]]]

И я хочу умножить каждое целое число на -1.Я пробовал разные вещи и получал разные ошибки, но это самый логичный код, который я написал на мой взгляд:

for p in range(len(my_list):
    for q in range(len(mylist[p])):
        my_new_list = [[i,j] * -1 for [i,j] in my_list[p][q]]

А этот даже не работает!В конечном итоге я хочу что-то вроде этого:

my_new_list = [[[0, -3], [0, 0]], [[-77, -94], [-76, -94], [-77, -93], [-76, -93], [-76, -90], [-77, -84], [-76, -88]], [[-25, -31], [-10, 0]]]

Может ли кто-нибудь помочь мне с этим, пожалуйста?

Ответы [ 2 ]

5 голосов
/ 19 июня 2019

Ваша проблема в том, что ваш внутренний цикл создает новый подсписок, но не присваивает его обратно (либо новому списку, либо my_list) соответствующим образом. Результат предыдущей итерации повторяетсяпишется каждый раз.

Что вам нужно, это понимание списка с тремя циклами, по одному для каждого уровня вложенности:

my_new_list = [[[z * -1 for z in y] for y in x] for x in my_list]

Если вы можете гарантировать, что ваши самые внутренние списки всегда являются парами, вы можетеупростите это согласно предложению @ ShadowRanger и используйте компоновку вложенного списка с двумя циклами,

my_new_list = [[[-a, -b] for a, b in x] for x in my_list]

Это эквивалентно выполнению

import copy 

my_new_list = copy.deepcopy(my_list)
for x in my_new_list:
    for y in x:
        for i, z in enumerate(y): 
            y[i] = z * -1   # notice the assignment back to the sublist
2 голосов
/ 19 июня 2019

Чтобы сделать это для списка произвольной глубины, вы можете использовать эту рекурсивную функцию:

def negate(list_or_int):
    if isinstance(list_or_int, list):
        # It's a list, so call negate on every element
        return [negate(i) for i in list_or_int]

    # It's an int, so just return the negative
    return -list_or_int

my_new_list = negate(my_list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...