2013-07-02 28 views
33

Cách thanh lịch và súc tích nhất (không tạo lớp của riêng tôi với quá tải toán tử) để thực hiện số học tuple trong Python 2.7 là gì?Cách thanh lịch để thực hiện số học tuple

phép nói rằng tôi có hai tuples:

a = (10, 10) 
b = (4, 4) 

kết quả dự định của tôi là

c = a - b = (6, 6) 

Tôi hiện đang sử dụng:

c = (a[0] - b[0], a[1] - b[1]) 

Tôi cũng đã cố gắng:

c = tuple([(i - j) for i in a for j in b]) 

nhưng kết quả là (6, 6, 6, 6). Tôi tin rằng các công trình trên như là một lồng nhau cho các vòng lặp dẫn đến 4 lần lặp và 4 giá trị trong kết quả.

+0

Nếu bạn đang thực hiện rất nhiều điều này và chúng không nhất thiết phải là _tuples_, bạn có thể xem gumpy –

Trả lời

39

Nếu bạn đang tìm kiếm nhanh chóng, bạn có thể sử dụng numPy:

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

và nếu bạn muốn giữ nó trong một tuple:

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

Sử dụng zip và một biểu thức máy phát điện:

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) 

Sử dụng itertools.izip kiếm một giải pháp bộ nhớ hiệu quả.

giúp đỡ về 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. 
+0

Cảm ơn câu trả lời chi tiết! –

+0

Chỉ cần lưu ý trên 'izip': Trong Python 3, hàm' zip' thông thường hoạt động giống như 'izip' của Python 2, vì vậy bạn có thể sử dụng' zip' làm ví dụ trong chương trình trả lời này. –

27

Một lựa chọn sẽ là,

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

itertools.imap có thể đóng vai trò như một sự thay thế cho map.

Tất nhiên bạn cũng có thể sử dụng các chức năng khác operator-add, mul, div vv

Nhưng tôi sẽ nghiêm túc xem xét chuyển sang một cấu trúc dữ liệu kể từ khi tôi không nghĩ rằng vấn đề kiểu này là thích hợp cho tuple s

+0

Cảm ơn. 1 cho nhà điều hành và bản đồ. –

2

này cũng có thể được thực hiện cũng giống như độc đáo mà không có một khẩu ở tất cả, mặc dù lambda thường không mong muốn:

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

Nếu bạn đang tìm kiếm để có được những khoảng cách giữa hai điểm trên nói một 2ngày phối hợp bạn nên sử dụng giá trị tuyệt đối của phép trừ của các cặp.

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

yếu tố khôn ngoan của tôi tuple số học helper

hoạt động hỗ trợ: +, -, *, /, d

hoạt động = 'd' tính toán khoảng cách giữa hai điểm trên một 2D mặt phẳng tọa độ

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))") 
Các vấn đề liên quan