Работа со списком, выполнение арифметической логики на Python

#python #list

#python #Список

Вопрос:

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

Вот первый список, A :

 [109, 77, 57, 34, 94, 68, 96, 72, 39, 67, 49, 71, 121, 89, 61, 84, 45, 40, 104, 68, 54, 60, 68, 62, 91, 45, 41, 118, 44, 35, 53, 86, 41, 63, 111, 112, 54, 34, 52, 72, 111, 113, 47, 91, 107, 114, 105, 91, 57, 86, 32, 109, 84, 85, 114, 48, 105, 109, 68, 57, 78, 111, 64, 55, 97, 85, 40, 100, 74, 34, 94, 78, 57, 77, 94, 46, 95, 60, 42, 44, 68, 89, 113, 66, 112, 60, 40, 110, 89, 105, 113, 90, 73, 44, 39, 55, 108, 110, 64, 108]
  

И вот B :

 [35, 106, 55, 61, 81, 109, 82, 85, 71, 55, 59, 38, 112, 92, 59, 37, 46, 55, 89, 63, 73, 119, 70, 76, 100, 49, 117, 77, 37, 62, 65, 115, 93, 34, 107, 102, 91, 58, 82, 119, 75, 117, 34, 112, 121, 58, 79, 69, 68, 72, 110, 43, 111, 51, 102, 39, 52, 62, 75, 118, 62, 46, 74, 77, 82, 81, 36, 87, 80, 56, 47, 41, 92, 102, 101, 66, 109, 108, 97, 49, 72, 74, 93, 114, 55, 116, 66, 93, 56, 56, 93, 99, 96, 115, 93, 111, 57, 105, 35, 99]
  

Как я мог бы сгенерировать логику арифметического сложения, обрабатывая каждое попарное значение одно за другим ( A[0] and B[0] , через A[99], B[99] ) и создавая список C ( A[0] B[0] через A[99] B[99] )?

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

1. спасибо за исправления моих английских слов..

Ответ №1:

 result = [(x   y) for x, y in itertools.izip(A, B)]
  

Или:

 result = map(operator.add, itertools.izip(A, B))
  

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

1. operator.add может быть лучшим выбором, чем sum

2. @ но если я хочу добавить модульное дополнение (пример, 125) и как насчет результата? использование result = [(x y) для x, y в itertools.izip(A, B) 5] не работает

3. @haeaohoh: [(x y) % 125 for x, y in itertools.izip(A, B)] . Выражение, которое работает с элементами, всегда находится перед for .

4. @CatPlusPlus, хорошо, теперь я понимаю, я просто хочу создать одноразовый инструмент шифрования для этих вопросов, спасибо 🙂

Ответ №2:

Вот два возможных варианта:

  • Используйте понимание списка.
  • Используйте NumPy.

Для удобства я буду использовать сокращенные версии ваших списков, а сумма по элементам войдет в c .

Понимание списка

 a = [109, 77, 57, 34, 94, 68, 96]
b = [35, 106, 55, 61, 81, 109, 82]
c = [a_el   b_el for a_el,b_el in zip(a, b)]
  

NumPy

 import numpy as np

a = np.array([109, 77, 57, 34, 94, 68, 96])
b = np.array([35, 106, 55, 61, 81, 109, 82])
c = a   b
  

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

1. Хм, а затем, если добавить модульное сложение (пример 125), сработает ли c = ((a b)5)?

2. @haeaohoh Да, для опции NumPy вы можете сделать (a b) % 125 . Было бы неплохо отредактировать ваш вопрос, чтобы включить это требование, если вы его ищете.

3. @haeaohoh Конечно, понимание списка также может быть изменено для выполнения модульного сложения: c = [(a_el b_el) % 125 for a_el,b_el in zip(a, b)] .

4. Спасибо, довольно хорошо работает, это может быть полезно для алгоритмов одноразового использования

Ответ №3:

С пониманием списка:

 C = [A[i]  B[i] for i in range(len(A))]
  

И даже безопаснее:

 C = [A[i]  B[i] for i in range(len(A)) if len(A) == len(B)]
  

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

1. код кажется мне довольно сложным C = [A [i] B[i] для i в диапазоне (len(A)), если len(A) == len(B)]

2. Тогда не используйте это. Я просто предоставляю его для завершения, т. Е. работает только первая строка и предполагается, что длины обоих списков равны, но это не всегда может быть так. То же самое для большинства других опубликованных решений.

3. Никаких проблем со значениями, вы мне очень помогли, спасибо 🙂