2012-05-12 30 views
21

Nếu tôi có hàm def f(a, b, c, d) và hai bộ, mỗi phần tử có hai phần tử, có cách nào để giải nén các bộ này để tôi có thể gửi giá trị của chúng cho hàm không?Làm thế nào để giải nén nhiều bộ dữ liệu trong hàm gọi

f(*tup1, *tup2) 
+2

Tôi cũng cảm thấy điều này sẽ hiệu quả. Chỉ cho phép một biểu thức * và ** mở rộng các đối số trong hàm _calls_ có vẻ như là một hạn chế không cần thiết đối với tôi. Tương tự như vậy để cho phép nó chỉ ở cuối danh sách. Hạn chế này dẫn đến thực hành mã lộn xộn và xây dựng lệnh dict xung quanh các cuộc gọi hàm. – Stefan

+1

Kể từ [Python 3.5.0] (https://www.python.org/downloads/release/python-350/), nhờ [PEP-448] (http://www.python.org/dev/ peps/pep-0448 /), psuedocode của bạn bây giờ là Python hợp lệ. Xem [câu trả lời được cập nhật của tôi] (http://stackoverflow.com/a/10564819/722121). –

Trả lời

24

Tính đến the release of Python 3.5.0, PEP 448 "Additional Unpacking Generalizations" làm cho cú pháp tự nhiên cho Python hợp lệ này:

>>> f(*tup1, *tup2) 
1 2 2 3 

Trong các phiên bản cũ của Python, bạn có thể cần phải nối các tuples với nhau để cung cấp một cuộc tranh luận mở rộng duy nhất:

>>> tup1 = 1, 2 
>>> tup2 = 2, 3 
>>> def f(a, b, c, d): 
     print(a, b, c, d) 

>>> f(*tup1+tup2) 
1 2 2 3 
+0

Nếu tup1 là chiều dài 4, tup2 có bị bỏ qua không? Đó có phải là hành vi mong muốn không? – Spacedman

+2

@Spacedman Không, 6 giá trị sẽ được gửi và bạn sẽ gặp lỗi (hoặc nó sẽ hoạt động cho một hàm có 6 đối số). –

+0

Phải, nhưng nếu hai tups thêm tối đa bốn nó sẽ làm việc nhưng hùng mạnh mặt nạ một lỗi tinh tế. Tôi luôn muốn giải nén một cách rõ ràng. – Spacedman

-4
f(tup1[0],tup1[1],tup2[0],tup2[1]) #not good enough? 
+6

Điều gì sẽ xảy ra nếu bạn không biết độ dài của bộ dữ liệu? Thêm vào đó là xấu xí. –

+1

Nếu tuples không dài 2, điều gì sẽ xảy ra trong giải pháp khác? Rõ ràng là tốt hơn so với tiềm ẩn? – Spacedman

+2

@Spacedman Điều này là tẻ nhạt để đọc và viết. –

11

Một cách tiếp cận sử dụng chain

>>> from itertools import chain 
>>> def foo(a,b,c,d): 
     print a,b,c,d 


>>> tup1 = (1,2) 
>>> tup2 = (3,4) 
>>> foo(*chain(tup1,tup2)) 
1 2 3 4 
+1

+1. Giải pháp tốt, đặc biệt nếu bạn có nhiều bộ dữ liệu. –

+0

@Lattyware đúng, nhưng đối với hai bộ nhớ, giải pháp của bạn nhanh nhất theo các bài kiểm tra của tôi. – jamylak

Các vấn đề liên quan