Выполните итерацию списка Python и сохраните результат в двух разных списках - PullRequest
0 голосов
/ 09 января 2020

В моей программе два списка номеров. Что я хочу сделать, так это перебрать список zip, полученный с помощью zip(), применить две разные функции к двум промежуточным переменным и сохранить первый результат (apply compute_add()) в одном списке и второй (apply compute_sub()) в другой. Я могу сделать это дважды в списке zip, но мне интересно, есть ли способ сделать это одним выстрелом.
Вот мой код, конечно, не работает.

def compute_add(_x, _y):
    return _x * _y + 10


def compute_sub(_x, _y):
    return _x * _y - 10


list1 = [1, 2, 3, 4, 5]
list2 = [10, 20, 30, 40, 50]

res1, res2 = [compute_add(x, y), compute_sub(x, y) for x, y in zip(list1, list2)]

Есть предложения?

Ответы [ 5 ]

3 голосов
/ 09 января 2020

Предполагая, что вам нужны суммы в одном списке, а различия - в другом, простого способа сделать это с пониманием списка не существует. Вы можете собрать пары в кортеж, а затем разбить их на два списка:

tup = [(compute_add(x, y), compute_sub(x, y)) for x, y in zip(list1, list2)]
res1 = [t[0] for t in tup]
res2 = [t[1] for t in tup]

С одним l oop над почтовым индексом я бы просто сделал

res1 = []
res2 = []
for x, y in zip(list1, list2):
    res1.append(compute_add(x,y))
    res2.append(compute_sub(x,y))

Если функции действительно так просты, конечно, вы можете вычленить умножение:

for x, y in zip(list1, list2):
    mul = x * y
    res1.append(mul + 10)
    res2.append(mul - 10)

Для чего стоит, Какая обратная функция zip в python? имеет хороший ответ на вопрос «как я могу сделать обратное с zip()», но он также эффективно проходит список два раза.

1 голос
/ 09 января 2020

Вы можете добавить результаты в два списка во время итерации

res1 = []
res2 = []
[[res1.append(compute_add(x, y)), res2.append(compute_sub(x, y))] for x, y in zip(list1, list2)]

print(res1, res2) # [20, 50, 100, 170, 260] [0, 30, 80, 150, 240]
1 голос
/ 09 января 2020

Метод 1: с использованием список-понимания

def compute_add(_x, _y):
    return _x * _y + 10
def compute_sub(_x, _y):
    return _x * _y - 10

list1 = [1, 2, 3, 4, 5]
list2 = [10, 20, 30, 40, 50]
res1 = [compute_add(x, y) for x, y in zip(list1, list2)]
res2 = [compute_sub(x, y) for x, y in zip(list1, list2)]

print(res1) # [20, 50, 100, 170, 260]
print(res2) # [0, 30, 80, 150, 240]

Метод 2: с использованием для l oop

Вы можете просто выполнить итерацию по полученному списку почтовых индексов и напрямую применить определенные вами функции. Смотрите приведенный выше код.

def compute_add(_x, _y):
    return _x * _y + 10
def compute_sub(_x, _y):
    return _x * _y - 10

list1 = [1, 2, 3, 4, 5]
list2 = [10, 20, 30, 40, 50]
res1 = []
res2 = []
for x, y in zip(list1, list2):
    res1.append(compute_add(x, y))
    res2.append(compute_sub(x, y))

print(res1) # [20, 50, 100, 170, 260]
print(res2) # [0, 30, 80, 150, 240]
0 голосов
/ 09 января 2020

Попробуйте использовать zip:

res1, res2 = zip(*[(compute_add(x, y), compute_sub(x, y)) for x, y in zip(list1, list2)])
0 голосов
/ 09 января 2020

просто измените код следующим образом

res1, res2 = [[compute_add(x, y) for x, y in zip(list1, list2)], [compute_sub(x, y) for x, y in zip(list1, list2)]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...