2015-02-17 19 views
3

Я надеялся на элегантный или эффективный способ размножения последовательностей целых чисел (или поплавков).Python Множественные кортежи равной длины

Моя первая мысль состояла в том, чтобы попробовать (1, 2, 3) * (1, 2, 2) приведет (1, 4, 6), продукты отдельных умножений.

Хотя python не предназначен для выполнения последовательностей. Это нормально, я бы не ожидал этого. Итак, что такое питонический способ умножить (или, возможно, другие арифметические операции) каждый элемент в двух сериях и с их соответствующими индексами?

Второй пример (0.6, 3.5) * (4, 4) = (2.4, 14)

+1

Может быть, вы должны смотреть на 'numpy', оператор умножения при использовании двух' numpy.arrays' будет вести себя, как вы ожидать. – Akavall

+0

@Akavall, Не хотите ли, чтобы вы опубликовали несколько примеров? – ThorSummoner

+0

@ThorSummoner: См. Мой ответ. –

ответ

1

С списковых операция может быть завершена, как

def seqMul(left, right): 
    return tuple([value*right[idx] for idx, value in enumerate(left)]) 

seqMul((0.6, 3.5), (4, 4)) 
5

Самый простой способ состоит в использовании zip функцию, с generator expression, как этот

tuple(l * r for l, r in zip(left, right)) 

Например,

>>> tuple(l * r for l, r in zip((1, 2, 3), (1, 2, 3))) 
(1, 4, 9) 
>>> tuple(l * r for l, r in zip((0.6, 3.5), (4, 4))) 
(2.4, 14.0) 

В Python 2.x, zip возвращает список кортежей. Если вы хотите, чтобы избежать создания временного списка, вы можете использовать itertools.izip, как этот

>>> from itertools import izip 
>>> tuple(l * r for l, r in izip((1, 2, 3), (1, 2, 3))) 
(1, 4, 9) 
>>> tuple(l * r for l, r in izip((0.6, 3.5), (4, 4))) 
(2.4, 14.0) 

Вы можете прочитать больше о различиях между zip и itertools.izip в this question.

1
A = (1, 2, 3) 
B = (4, 5, 6)  
AB = [a * b for a, b in zip(A, B)] 

использовать itertools.izip вместо zip для больших входов.

+0

Можете ли вы опубликовать пример itertools? Этот точный ответ типа «почтовый + список» уже был отправлен @thefourtheye – ThorSummoner

+0

@ThorSummoner, да, это то же самое, что и другой ответ, который был опубликован, когда я писал свой ответ. для версии izip 'import itertools' и использовать' itertools.izip' вместо 'zip', иначе это точно то же самое. –

5

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

Например:

>>> import numpy as np 
>>> x = np.array([1, 2, 3]) 
>>> y = np.array([1, 2, 2]) 
>>> x * y 
array([1, 4, 6]) 
>>> x + y 
array([2, 4, 5]) 
5

Более простой способ был бы:

from operator import mul 

In [19]: tuple(map(mul, [0, 1, 2, 3], [10, 20, 30, 40])) 
Out[19]: (0, 20, 60, 120) 
+0

Nice, и его можно легко расширить, чтобы обрабатывать другие двоичные операторы. Хотя я думаю, что OP может захотеть 'tuple (map (mul, seq1, seq2))'. – martineau

+0

@martineau Обновленный ответ, спасибо! –

+0

Вы вводите и выходите не так. В частности, вы должны получить «tuple», а не «list' ;-) – mgilson

Смежные вопросы