Toán tử Python trong bộ cài đặt toán tử


143

Tôi hơi bối rối về intoán tử python cho các bộ.

Nếu tôi có một tập hợp svà một số trường hợp b, điều đó có đúng không b in s" có một số phần tử xtrong sđó b == xtrue "?


77
Bạn có phải là nhà toán học? Mô tả những điều đơn giản theo cách quá phức tạp ..;)
ThiefMaster

13
Nhà khoa học máy tính. Tôi chỉ hơi bối rối vì tài liệu có nội dung "Kiểm tra x cho tư cách thành viên trong s." Đối với tôi điều đó có nghĩa là "thể hiện x được chứa trong s" hoặc "một số thể hiện tồn tại trong s có cùng giá trị với x". Tôi không biết liệu đây là so sánh bản sắc hay bình đẳng.
Dejas

6
@Dejas: Vì bạn biết rằng Python có hai toán tử So sánh bình đẳng và so sánh danh tính, nên bạn có thể xây dựng một thử nghiệm xác nhận từng toán tử. Nó sẽ giúp nếu bạn đăng thí nghiệm đó.
S.Lott

Câu trả lời:


101

Đúng, nhưng điều đó cũng có nghĩa hash(b) == hash(x), vì vậy sự bình đẳng của các mặt hàng không đủ để làm cho chúng giống nhau.


14
Ok vậy "có phần tử x trong s sao cho hàm băm (b) == hash (x) và x == b" không?
Dejas

12
Nếu ai đó thực hiện hàm băm của lớp mình theo cách xoắn, đây là những gì anh ta có thể nhận được (và xứng đáng).
xấu xí

84

Đúng rồi. Bạn có thể thử nó trong trình thông dịch như thế này:

>>> a_set = set(['a', 'b', 'c'])

>>> 'a' in a_set
True

>>>'d' in a_set
False

2
Đây không phải là một thử nghiệm rất tốt vì các hằng chuỗi thường được thực hiện (thử a = 'a'; b = 'a'; a is b). Tôi đã thử nó với a = (1, 2, 3); b = (1, 2, 3); a == b; hash(a) == hash(b); a is b; a in set([b])thay thế.
Philipp

11

Vâng, nó có thể có nghĩa như vậy, hoặc nó có thể là một trình vòng lặp đơn giản. Ví dụ: Ví dụ như iterator:

a=set(['1','2','3'])
for x in a:
 print ('This set contains the value ' + x)

Tương tự như một kiểm tra:

a=set('ILovePython')
if 'I' in a:
 print ('There is an "I" in here')

chỉnh sửa: chỉnh sửa để bao gồm các bộ thay vì danh sách và chuỗi


2
Điều này có liên quan gì đến bộ?
Ignacio Vazquez-Abrams

Tôi cho rằng một danh sách hoặc thậm chí một chuỗi có thể được coi là có các thuộc tính tương tự như một tập hợp. Họ là một tập hợp các yếu tố.
Arnab Ghosal

1
Không, các bộ có một điều kiện bổ sung để kiểm tra ngăn chặn mà các chuỗi không có.
Ignacio Vazquez-Abrams

3

Các chuỗi, mặc dù chúng không phải là setloại, có một thuộc tính có giá trị introng quá trình xác thực trong các tập lệnh:

yn = input("Are you sure you want to do this? ")
if yn in "yes":
    #accepts 'y' OR 'e' OR 's' OR 'ye' OR 'es' OR 'yes'
    return True
return False

Tôi hy vọng điều này sẽ giúp bạn hiểu rõ hơn về việc sử dụng invới ví dụ này.


2
Đó không phải là một bộ. Cũng không phải là chuỗi đột biến.
Ignacio Vazquez-Abrams

7
... or 'e' or 'es' or 's'. Hãy xem xét chỉ cần xóa câu trả lời sai vô nghĩa này.
Quuxplusone

3

Các bộ hoạt động khác với các dicts, bạn cần sử dụng các thao tác thiết lập như issubset ():

>>> k
{'ip': '123.123.123.123', 'pw': 'test1234', 'port': 1234, 'debug': True}
>>> set('ip,port,pw'.split(',')).issubset(set(k.keys()))
True
>>> set('ip,port,pw'.split(',')) in set(k.keys())
False

Nó thật thú vị. Và một ứng dụng thực tế tuyệt vời là tốt.
Armstrongest
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.