129
Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.
Tôi có một số danh sách có tất cả cùng một số mục nhập (mỗi lần chỉ định thuộc tính đối tượng):
property_a = [545., 656., 5.4, 33.] property_b = [ 1.2, 1.3, 2.3, 0.3] ...và liệt kê với những lá cờ có cùng chiều dài
good_objects = [True, False, False, True](có thể dễ dàng thay thế bằng danh sách chỉ mục tương đương:
good_indices = [0, 3]Cách dễ nhất để tạo danh sách mới good_objects = [True, False, False, True] 4, good_objects = [True, False, False, True] 5, ... chỉ chứa các giá trị được chỉ định bởi các mục good_objects = [True, False, False, True] 6 hoặc các chỉ số là gì?
property_asel = [545., 33.] property_bsel = [ 1.2, 0.3]
Silentghost
294K64 Huy hiệu vàng301 Huy hiệu bạc291 Huy hiệu Đồng64 gold badges301 silver badges291 bronze badges
hỏi ngày 5 tháng 7 năm 2010 lúc 11:30Jul 5, 2010 at 11:30
fuenfundachtzigfuenfundachtzigfuenfundachtzig
7.51612 Huy hiệu vàng60 Huy hiệu bạc83 Huy hiệu đồng12 gold badges60 silver badges83 bronze badges
Bạn chỉ có thể sử dụng danh sách hiểu biết:
property_asel = [val for is_good, val in zip(good_objects, property_a) if is_good]hoặc
property_asel = [property_a[i] for i in good_indices]Cái sau nhanh hơn vì có ít good_objects = [True, False, False, True] 7 hơn độ dài của good_objects = [True, False, False, True] 8, giả sử good_objects = [True, False, False, True] 7 được tính toán trước thay vì được tạo ra khi đang bay.
Chỉnh sửa: Tùy chọn đầu tiên tương đương với good_indices = [0, 3] 0 có sẵn kể từ Python 2.7/3.1. Xem câu trả lời của @Gary Kerr.: The first option is equivalent to good_indices = [0, 3] 0 available since Python 2.7/3.1. See @Gary Kerr's answer.
property_asel = list(itertools.compress(property_a, good_objects))
Đã trả lời ngày 5 tháng 7 năm 2010 lúc 11:32Jul 5, 2010 at 11:32
Kennytmkennytmkennytm
498K101 Huy hiệu vàng1062 Huy hiệu bạc994 Huy hiệu Đồng101 gold badges1062 silver badges994 bronze badges
7
Tôi thấy 2 tùy chọn.
Sử dụng Numpy:
property_a = numpy.array([545., 656., 5.4, 33.]) property_b = numpy.array([ 1.2, 1.3, 2.3, 0.3]) good_objects = [True, False, False, True] good_indices = [0, 3] property_asel = property_a[good_objects] property_bsel = property_b[good_indices]Sử dụng danh sách hiểu và zip nó:
property_a = [545., 656., 5.4, 33.] property_b = [ 1.2, 1.3, 2.3, 0.3] good_objects = [True, False, False, True] good_indices = [0, 3] property_asel = [x for x, y in zip(property_a, good_objects) if y] property_bsel = [property_b[i] for i in good_indices]
Đã trả lời ngày 5 tháng 7 năm 2010 lúc 11:34Jul 5, 2010 at 11:34
3
Sử dụng zip chức năng tích hợp
property_asel = [a for (a, truth) in zip(property_a, good_objects) if truth]CHỈNH SỬA
Chỉ cần nhìn vào các tính năng mới của 2.7. Hiện tại có một chức năng trong mô -đun itertools tương tự như mã trên.
//docs.python.org/library/itertools.html#itertools.compress
good_objects = [True, False, False, True] 0Đã trả lời ngày 5 tháng 7 năm 2010 lúc 11:34Jul 5, 2010 at 11:34
Sử dụng zip chức năng tích hợpGary Kerr
CHỈNH SỬA4 gold badges47 silver badges50 bronze badges
3
Chỉ cần nhìn vào các tính năng mới của 2.7. Hiện tại có một chức năng trong mô -đun itertools tương tự như mã trên.
good_objects = [True, False, False, True] 1Gary Kerrgary Kerr
good_objects = [True, False, False, True] 212.8k4 Huy hiệu vàng47 Huy hiệu bạc 50 Huy hiệu Đồng
Giả sử bạn chỉ có danh sách các mục và danh sách các chỉ số đúng/cần thiết, đây sẽ là nhanh nhất:
Điều này có nghĩa là lựa chọn tài sản sẽ chỉ làm nhiều vòng như có các chỉ số đúng/bắt buộc. Nếu bạn có nhiều danh sách thuộc tính tuân theo các quy tắc của một thẻ (đúng/sai), bạn có thể tạo danh sách chỉ số bằng cách sử dụng cùng một nguyên tắc hiểu danh sách:index for every group of index, item that exists in an enumeration of good objects, if (where) the item is True
Điều này lặp lại thông qua từng mục trong Good_Objects (trong khi ghi nhớ chỉ mục của nó với sự liệt kê) và chỉ trả về các chỉ số trong đó mục là đúng.Mar 11, 2014 at 16:54
Đối với bất kỳ ai không nhận được danh sách hiểu, đây là phiên bản văn xuôi tiếng Anh với mã được tô sáng trong in đậm:Eyrofire
Liệt kê chỉ mục cho mọi nhóm chỉ mục, mục tồn tại trong một bảng liệt kê các đối tượng tốt, nếu (trong đó) vật phẩm là đúng2 silver badges9 bronze badges
Đã trả lời ngày 11 tháng 3 năm 2014 lúc 16:54
good_objects = [True, False, False, True] 3Eyrofireeyrofire
3102 Huy hiệu bạc9 Huy hiệu ĐồngJun 14, 2014 at 22:08
1