2015-05-11 19 views
11

Vì vậy, tôi tự hỏi tại sao điều này:Chuỗi vs thành viên danh sách kiểm tra

'alpha' in 'alphanumeric' 

True, nhưng

list('alpha') in list('alphanumeric') 

False.

Tại sao x in s thành công khi x là một chuỗi con của s, nhưng x in l không khi x là một danh sách phụ của l?

+2

Nếu bạn in 'danh sách ('chữ') ', bạn sẽ nhận thấy rằng nó không có một danh sách con chứa ''alpha'' trong đó. – tdelaney

+2

@tdelaney Nhưng nó chứa danh sách con '['a', 'l', 'p', 'h', 'a']'. Nếu 'in' được kiểm tra cho các danh sách con và không chỉ là thành viên thì danh sách ('alpha') trong danh sách ('chữ và số')' thực sự sẽ trả về 'True'. –

Trả lời

10

Khi bạn sử dụng chức năng list với bất kỳ lần lặp nào, một đối tượng danh sách mới sẽ được tạo với tất cả các phần tử từ có thể lặp lại dưới dạng các phần tử riêng lẻ trong danh sách.

Trong trường hợp của bạn, dây là iterables Python hợp lệ, vì vậy

>>> list('alpha') 
['a', 'l', 'p', 'h', 'a'] 
>>> list('alphanumeric') 
['a', 'l', 'p', 'h', 'a', 'n', 'u', 'm', 'e', 'r', 'i', 'c'] 

Vì vậy, bạn đang kiểm tra một cách hiệu quả nếu một danh sách là danh sách phụ chứa các danh sách khác.

Trong chuỗi chỉ Python có toán tử in để kiểm tra xem một chuỗi có phải là một phần của chuỗi khác hay không. Đối với tất cả các bộ sưu tập khác, bạn chỉ có thể sử dụng các thành viên riêng lẻ. Trích dẫn số documentation,

Các toán tử innot in kiểm tra thành viên thu nợ. x in s đánh giá là đúng nếu x là thành viên của bộ sưu tập s và sai khác. x not in s trả về phủ định của x in s. Kiểm tra thành viên bộ sưu tập theo truyền thống bị ràng buộc theo trình tự; một đối tượng là một thành viên của một bộ sưu tập nếu bộ sưu tập là một chuỗi và chứa một phần tử bằng đối tượng đó. Tuy nhiên, nó có ý nghĩa đối với nhiều loại đối tượng khác để hỗ trợ kiểm tra thành viên mà không phải là một chuỗi. Đặc biệt, từ điển (cho khóa) và bộ hỗ trợ kiểm tra thành viên.

Đối với danh sách và loại bộ, x in y là đúng nếu và chỉ khi có chỉ mục i sao cho x == y[i] là đúng.

Đối với các loại Unicode và chuỗi, x in y là đúng nếu và chỉ nếu x là một chuỗi con của y. Kiểm tra tương đương là y.find(x) != -1. Lưu ý, xy không cần phải cùng loại; do đó, u'ab' trong 'abc' sẽ trả lại True. Chuỗi trống luôn được coi là chuỗi con của bất kỳ chuỗi nào khác, do đó, "" trong "abc" sẽ trả lại True.

4

list s xác định tư cách thành viên nếu một mục bằng với một trong các thành viên trong danh sách.

str s xác định xem chuỗi một là trong chuỗi b nếu một chuỗi con của b bằng một.

4

Đối với điều thứ hai bạn đang yêu cầu nếu

['a', 'l', 'p', 'h', 'a'] in ['a', 'l', 'p', 'h', 'a', 'n', 'u', 'm', 'e', 'r', 'i', 'c']

và không có danh sách phụ trong danh sách thứ hai chỉ ký tự.

['a', 'l', 'p', 'h', 'a'] in [['a', 'l', 'p', 'h', 'a'], ['b', 'e', 't', 'a']]

sẽ là đúng

2

có lẽ bạn nên thử issubset phương pháp.

>>> set('alpha').issubset(set('alphanumeric')) 
True 

mặc dù set('alpha') lợi nhuận set(['a', 'p', 'l', 'h']), và set('alphanumeric'), set(['a', 'c', 'e', 'i', 'h', 'm', 'l', 'n', 'p', 'r', 'u']).

phương pháp đặt làm cho danh sách bỏ qua các yếu tố lặp lại.

3

Tôi cho rằng bạn đang tìm kiếm thực tế là stringlist có các cách triển khai khác nhau của phương pháp ma thuật __contains__.

https://docs.python.org/2/reference/datamodel.html#object.contains

Đây là lý do tại sao 'alpha' in 'alphanumeric' là True, nhưng

list('alpha') in list('alphanumeric') là False

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