2013-05-03 42 views
13

Tôi muốn đóng gói tất cả dữ liệu trong một danh sách vào một bộ đệm đơn để gửi qua một ổ cắm UDP. Danh sách tương đối dài, vì vậy việc lập chỉ mục từng phần tử trong danh sách là tẻ nhạt. Đây là những gì tôi có cho đến nay:Python struct.pack() cho từng phần tử trong danh sách?

NumElements = len(data) 
buf = struct.pack('d'*NumElements,data[0],data[1],data[2],data[3],data[4]) 

Nhưng tôi muốn làm một cái gì đó hơn pythonic mà không yêu cầu tôi thay đổi cuộc gọi nếu tôi thêm nhiều yếu tố vào danh sách ... cái gì đó như:

NumElements = len(data) 
buf = struct.pack('d'*NumElements,data) # Returns error 

Có cách nào tốt để làm điều này không ??

Trả lời

15

Có, bạn có thể sử dụng cú pháp gọi *args.

Thay vì điều này:

buf = struct.pack('d'*NumElements,data) # Returns error 

... làm điều này:

buf = struct.pack('d'*NumElements, *data) # Works 

Xem Unpacking Argument Lists trong hướng dẫn. (Nhưng thực sự, đọc tất cả các phần 4.7, không chỉ 4.7.4, hoặc bạn sẽ không biết những gì "Tình hình ngược lại ..." là đề cập đến ...) Ngắn gọn:

... khi các đối số đã có trong một danh sách hoặc tuple nhưng cần phải được giải nén cho một cuộc gọi chức năng yêu cầu các đối số vị trí riêng biệt… hãy viết cuộc gọi hàm với * -operator để giải nén các đối số ra khỏi danh sách hoặc tuple…

+0

Ah đó chỉ là những gì tôi cần! Cảm ơn bạn! – user1636547

+1

''d' * NumElements' không phải là thực hành rất tốt, nó có thể kết thúc làm cho một chuỗi rất lớn, chỉ phải lãng phí thời gian phân tích cú pháp, chỉ để miễn phí sau đó. Thay vào đó bao gồm số trực tiếp trong chuỗi: 'buf = struct.pack (" {0: d} d ".format (NumElements), * dữ liệu)' – ideasman42

+0

@ ideasman42: Điểm tốt. Nhưng với một số lượng lớn các giá trị, việc giải nén chúng thành 500000 đối số có thể là một vấn đề khi chuyển 'd' * 500000, vì vậy bạn có thể muốn kiểm tra điều đó với 'b ''. Join (struct.pack ('d') , elem) cho elem trong dữ liệu) ', hoặc xem xét sử dụng một cái gì đó như' mảng' hoặc 'ctypes' thay vì' struct'. – abarnert

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