Hướng dẫn python set membership test - python đặt bài kiểm tra thành viên

Có hiệu quả hơn không khi kiểm tra xem một mục đã có trong danh sách trước khi thêm nó:

for word in open('book.txt','r').read().split():
if word in list:
    pass
else:
    list.append(item)

Hoặc để thêm tất cả mọi thứ sau đó chạy set () trên nó? như thế này:

for word in open('book.txt','r').read().split():
    list.append(word)
list = set(list)

Đã hỏi ngày 14 tháng 1 năm 2014 lúc 20:27Jan 14, 2014 at 20:27

5

Nếu ý định cuối cùng là xây dựng một tập hợp, hãy xây dựng nó trực tiếp và không bận tâm với danh sách:

words = set(open('book.txt','r').read().split())

Điều này sẽ đơn giản và hiệu quả.

Giống như mã ban đầu của bạn, điều này có nhược điểm của lần đầu tiên đọc toàn bộ tệp vào bộ nhớ. Nếu đó là một vấn đề, điều này có thể được giải quyết bằng cách đọc một dòng tại một thời điểm:

words = set(word for line in open('book.txt', 'r') for word in line.split())

(Cảm ơn @Steve Jessop cho đề xuất.)

Chắc chắn không thực hiện cách tiếp cận đầu tiên trong câu hỏi của bạn, trừ khi bạn biết danh sách ngắn, vì nó sẽ cần phải quét toàn bộ danh sách trên mỗi từ.

Đã trả lời ngày 14 tháng 1 năm 2014 lúc 20:29Jan 14, 2014 at 20:29

Hướng dẫn python set membership test - python đặt bài kiểm tra thành viên

NPENPENPE

474K105 Huy hiệu vàng930 Huy hiệu bạc1002 Huy hiệu Đồng105 gold badges930 silver badges1002 bronze badges

9

A set là bảng băm trong khi list là một mảng. set Kiểm tra thành viên là O (1) trong khi các bài kiểm tra thành viên danh sách là O (N). Nếu bất cứ điều gì, bạn nên lọc list bằng cách sử dụng set, không lọc set bằng cách sử dụng list.

Đã trả lời ngày 14 tháng 1 năm 2014 lúc 20:33Jan 14, 2014 at 20:33

Silas Raysilas RaySilas Ray

25.2K5 Huy hiệu vàng47 Huy hiệu bạc61 Huy hiệu Đồng5 gold badges47 silver badges61 bronze badges

3

Đó là giá trị thử nghiệm để tìm hiểu; Nhưng tôi thường xuyên sử dụng toàn bộ để lọc danh sách của mình và tôi thấy nó hoạt động tốt; đặc biệt nếu mã là thử nghiệm và có thể thay đổi.

l = list( open( 'book.txt', 'r').read().split() )
unique_l = list(set( l ))
# maybe something else:
good_l = [ word for word in l if not word in naughty_words ]

Tôi đã nghe nói rằng điều này giúp hiệu quả; Nhưng như tôi đã nói, một bài kiểm tra nói nhiều hơn.

Đã trả lời ngày 14 tháng 1 năm 2014 lúc 20:32Jan 14, 2014 at 20:32

Mayur Patelmayur PatelMayur Patel

9151 Huy hiệu vàng7 Huy hiệu bạc15 Huy hiệu đồng1 gold badge7 silver badges15 bronze badges

3

Thuật toán với

for word in open('book.txt','r').read().split():
    list.append(word)
list = set(list)
3 là một hoạt động đắt tiền. Tại sao? Bởi vì, để xem nếu một mục trong danh sách, bạn phải kiểm tra mọi mục trong danh sách. Mỗi lần. Đó là một thuật toán họa sĩ. Mỗi lần tra cứu là o (n), và bạn làm điều đó. Không có chi phí khởi động, nhưng nó trở nên đắt đỏ rất nhanh. Và cuối cùng bạn nhìn vào từng mục nhiều hơn một lần - trung bình, LEN (danh sách)/2 lần.

Tìm kiếm để xem mọi thứ có ở trong bộ không, là (thường) rẻ hơn nhiều. Các mục được băm, vì vậy bạn tính toán băm, nhìn vào đó và nếu nó không có ở đó, nó không có trong tập hợp - O (1). Bạn phải tạo tập hợp lần đầu tiên, vì vậy bạn sẽ xem xét mọi mục một lần. Sau đó, bạn nhìn vào từng mục một lần nữa để xem nó đã có trong bộ của bạn. Vẫn còn O (N).

Vì vậy, làm

for word in open('book.txt','r').read().split():
    list.append(word)
list = set(list)
4 chắc chắn là thích hợp hơn với giải pháp đầu tiên của bạn.

Bakuriu

Phù bằng vàng 95K2121 gold badges189 silver badges223 bronze badges

Đã trả lời ngày 14 tháng 1 năm 2014 lúc 20:36Jan 14, 2014 at 20:36

Corley Brigmancorley BrigmanCorley Brigman

10,8K5 Huy hiệu vàng32 Huy hiệu bạc39 Huy hiệu đồng5 gold badges32 silver badges39 bronze badges

4

@Câu trả lời của NPE không đóng tệp rõ ràng. Tốt hơn là sử dụng Trình quản lý bối cảnh

with open('book.txt','r') as fin:
    words = set(fin.read().split())

Đối với các tập tin văn bản thông thường, điều này có lẽ là đủ. Nếu đó là toàn bộ chuỗi DNA chẳng hạn, bạn có thể không muốn đọc toàn bộ tệp vào bộ nhớ cùng một lúc.

Đã trả lời ngày 14 tháng 1 năm 2014 lúc 20:42Jan 14, 2014 at 20:42

Hướng dẫn python set membership test - python đặt bài kiểm tra thành viên

John La Rooyjohn La RooyJohn La Rooy

Phù bằng vàng 287K5151 gold badges359 silver badges500 bronze badges

3