Подтвердить что ты не робот

Элегантный способ выполнения арифметики кортежа

Каков самый элегантный и лаконичный способ (без создания моего собственного класса с перегрузкой оператора) для выполнения арифметики кортежа в 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 значения.

4b9b3361

Ответ 1

Если вы ищете быстрый способ, вы можете использовать numpy:

>>> import numpy
>>> numpy.subtract((10, 10), (4, 4))
array([6, 6])

и если вы хотите сохранить его в кортеже:

>>> tuple(numpy.subtract((10, 10), (4, 4)))
(6, 6)

Ответ 2

Один вариант:

>>> from operator import sub
>>> c = tuple(map(sub, a, b))
>>> c
(6, 6)

И itertools.imap может служить заменой map.

Конечно, вы также можете использовать другие функции из operator до add, mul, div и т.д.

Но я бы серьезно подумал о переходе в другую структуру данных, так как я не думаю, что этот тип проблемы подходит для tuple s

Ответ 3

Используйте 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.

Ответ 4

Это также можно сделать так же хорошо, без импорта вообще, хотя лямбда часто нежелательна:

tuple(map(lambda x, y: x - y, a, b))

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

tuple(map(lambda x ,y: abs(x - y), a, b))

Ответ 5

мой помощник по арифметическому набору элементов

поддерживаемые операции: +, -,/, *, 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 ))")