Nếu bạn không có Python 2.6 hoặc cao hơn, người ta xoay sang viết một rõ ràng cho vòng lặp:
def set_list_intersection(set_list):
if not set_list:
return set()
result = set_list[0]
for s in set_list[1:]:
result &= s
return result
set_list = [set([1, 2]), set([1, 3]), set([1, 4])]
print set_list_intersection(set_list)
# Output: set([1])
Bạn cũng có thể sử dụng reduce
:
set_list = [set([1, 2]), set([1, 3]), set([1, 4])]
print reduce(lambda s1, s2: s1 & s2, set_list)
# Output: set([1])
Tuy nhiên, nhiều lập trình viên Python không thích nó, including Guido himself:
Khoảng 12 năm trước, Python aquired lambda, reduce(), fil ter() và map(), lịch sự của (tôi tin) một hacker Lisp đã bỏ lỡ chúng và gửi các bản vá lỗi làm việc. Nhưng, mặc dù giá trị PR, tôi nghĩ rằng các tính năng này nên được cắt từ Python 3000.
Vì vậy, bây giờ giảm(). Đây thực sự là điều tôi ghét nhất, bởi vì, ngoài một vài ví dụ liên quan đến + hoặc *, hầu như mỗi lần tôi thấy một cuộc gọi reduce() với một đối số hàm số không nhỏ, tôi cần lấy bút và giấy để sơ đồ những gì thực sự đang được đưa vào hàm đó trước khi tôi hiểu những gì giảm() là nghĩa vụ phải làm. Vì vậy, trong tâm trí của tôi, khả năng áp dụng của reduce() là khá nhiều giới hạn cho các nhà khai thác kết hợp, và trong tất cả các trường hợp khác nó tốt hơn để viết ra các vòng lặp tích lũy một cách rõ ràng.
Bạn có thể vui lòng giải thích hoặc chỉ cho tôi tài liệu liên quan về những gì '* setlist' có nghĩa là ở đây không? (Cụ thể, dấu hoa thị làm gì?) Cảm ơn! – PurpleVermont
Đối với bất kỳ ai khác có thể có cùng câu hỏi với tôi, tôi đã tìm thấy câu trả lời ở đây: http://stackoverflow.com/questions/400739/what-does-asterisk-mean-in-python – PurpleVermont