Ответ 1
Если вы ищете быстрый способ, вы можете использовать numpy:
>>> import numpy
>>> numpy.subtract((10, 10), (4, 4))
array([6, 6])
и если вы хотите сохранить его в кортеже:
>>> tuple(numpy.subtract((10, 10), (4, 4)))
(6, 6)
Каков самый элегантный и лаконичный способ (без создания моего собственного класса с перегрузкой оператора) для выполнения арифметики кортежа в Python 2.7?
Допустим, у меня есть два кортежа:
a = (10, 10)
b = (4, 4)
Мой предполагаемый результат
c = a - b = (6, 6)
В настоящее время я использую:
c = (a[0] - b[0], a[1] - b[1])
Я также пробовал:
c = tuple([(i - j) for i in a for j in b])
но результат был (6, 6, 6, 6)
. Я считаю, что выше работает как вложенный для циклов, в результате чего в результате получается 4 итерации и 4 значения.
Если вы ищете быстрый способ, вы можете использовать numpy:
>>> import numpy
>>> numpy.subtract((10, 10), (4, 4))
array([6, 6])
и если вы хотите сохранить его в кортеже:
>>> tuple(numpy.subtract((10, 10), (4, 4)))
(6, 6)
Один вариант:
>>> from operator import sub
>>> c = tuple(map(sub, a, b))
>>> c
(6, 6)
И itertools.imap
может служить заменой map
.
Конечно, вы также можете использовать другие функции из operator
до add
, mul
, div
и т.д.
Но я бы серьезно подумал о переходе в другую структуру данных, так как я не думаю, что этот тип проблемы подходит для tuple
s
Используйте zip
и выражение генератора:
c = tuple(x-y for x, y in zip(a, b))
Demo:
>>> a = (10, 10)
>>> b = (4, 4)
>>> c = tuple(x-y for x, y in zip(a, b))
>>> c
(6, 6)
Используйте itertools.izip
для эффективного решения памяти.
help zip
:
>>> print zip.__doc__
zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]
Return a list of tuples, where each tuple contains the i-th element
from each of the argument sequences. The returned list is truncated
in length to the length of the shortest argument sequence.
Это также можно сделать так же хорошо, без импорта вообще, хотя лямбда часто нежелательна:
tuple(map(lambda x, y: x - y, a, b))
Если вы хотите получить расстояние между двумя точками, скажем, 2-й координатной плоскостью, вы должны использовать абсолютное значение вычитания пар.
tuple(map(lambda x ,y: abs(x - y), a, b))
мой помощник по арифметическому набору элементов
поддерживаемые операции: +, -,/, *, d
operation = 'd' вычисляет расстояние между двумя точками на двумерной координатной плоскости
def tuplengine(tuple1, tuple2, operation):
"""
quick and dirty, element-wise, tuple arithmetic helper,
created on Sun May 28 07:06:16 2017
...
tuple1, tuple2: [named]tuples, both same length
operation: '+', '-', '/', '*', 'd'
operation 'd' returns distance between two points on a 2D coordinate plane (absolute value of the subtraction of pairs)
"""
assert len(tuple1) == len(tuple2), "tuple sizes doesn't match, tuple1: {}, tuple2: {}".format(len(tuple1), len(tuple2))
assert isinstance(tuple1, tuple) or tuple in type(tuple1).__bases__, "tuple1: not a [named]tuple"
assert isinstance(tuple2, tuple) or tuple in type(tuple2).__bases__, "tuple2: not a [named]tuple"
assert operation in list("+-/*d"), "operation has to be one of ['+','-','/','*','d']"
return eval("tuple( a{}b for a, b in zip( tuple1, tuple2 ))".format(operation)) \
if not operation == "d" \
else eval("tuple( abs(a-b) for a, b in zip( tuple1, tuple2 ))")