2016-02-03 28 views
5

Giả sử tôi có một chuỗi rỗng, nó sẽ được chia:Làm cách nào để kiểm tra xem danh sách có chứa các phần tử trống không?

>>>''.split(',') 
[''] 

Kết quả của việc chia tay là ['']. Tôi sử dụng bool để kiểm tra xem nó có trống không. Nó sẽ trả về True.

>>>bool(['']) 
True 

Làm cách nào để kiểm tra kết quả phân tách trống?

+0

tôi nhìn thấy. nó không phải là một danh sách trống. Tôi hy vọng tôi sẽ loại trừ tình hình. Tôi đang nghĩ cách làm. – Tony

+0

Cuối cùng, bạn đang cố gắng làm gì? Không có vấn đề gì trong việc cố gắng tách một danh sách trống ở nơi đầu tiên, bạn có thể chuyển mã này bằng một câu lệnh if-if hoặc if-expression trong một danh sách hiểu: 'if s1: s2 = s1.split (',') .. .' – smci

Trả lời

7

Với bool(['']) bạn đang kiểm tra xem danh sách [''] có bất kỳ nội dung nào, mà nó, nội dung chỉ xảy ra là chuỗi trống ''.

Nếu bạn muốn kiểm tra xem tất cả các yếu tố trong danh sách không phải là 'trống rỗng' (vì vậy nếu danh sách chứa chuỗi '' nó sẽ trở lại False), bạn có thể sử dụng được xây dựng trong chức năng all():

all(v for v in l) 

này có tất cả các yếu tố v trong danh sách l và kiểm tra nếu nó có một giá trị True; nếu tất cả các thành phần trả về True nếu ít nhất một thành phần không trả về False. Như một ví dụ:

l = ''.split(',') 

all(v for v in l) 
Out[75]: False 

Bạn có thể thay thế này với any() để thực hiện một kiểm tra từng phần và xem nếu bất kỳ mục trong danh sách l có một giá trị của True.

Một ví dụ toàn diện hơn * với cả hai sử dụng:

l = [1, 2, 3, ''] 

all(l) 
# '' doesn't have a True value 
Out[82]: False 

# 1, 2, 3 have a True value 
any(l) 
Out[83]: True 

* Như @ShadowRanger chỉ ra trong các ý kiến, điều chính xác tương tự có thể được thực hiện với all(l) hoặc any(l) kể từ khi cả hai đều chỉ chấp nhận có thể lặp lại ở cuối.

+3

Đơn giản hóa: Thay đổi 'tất cả (v cho v trong l)' thành chỉ 'tất cả (l)'; không cần phải tạo một biểu thức máy phát đặc biệt khi 'all' có thể xử lý trực tiếp' list'. – ShadowRanger

+3

Ngoài ra, bạn đảo ngược 'tất cả' và' bất kỳ'; 'all' cho bạn biết nếu tất cả các kết quả không rỗng, không nếu nó có các phần tử không rỗng, và' any' nói nếu nó có các phần tử không rỗng (nó vẫn có thể rỗng, nhưng nếu 'bất kỳ' trả về' Đúng ', ít nhất một là không trống). 'any' có thể hữu ích hơn ở đây. – ShadowRanger

0

Kết quả phân tách không trống. Ý nghĩa của "sự trống rỗng" bạn đang tìm kiếm được kiểm tra tốt nhất bằng cách nhìn vào bản gốc, chuỗi unsplit:

if not original_string: 
    # It's empty. 

Nhưng nếu bạn thực sự muốn nhìn vào kết quả chia cho điều này:

if len(split_result) == 1 and not split_result[0]: 
    # It's "empty". 
1

Trong trường hợp của bạn nó thực sự isnt trống

Nếu bạn muốn kiểm tra nếu các yếu tố trong danh sách đó là sản phẩm nào bạn có thể làm:

string = ''.split(',') 

if not string[0]: 
    print "empty" 
0

Theo số str.split() documentation,"Tách chuỗi trống bằng dấu phân cách được chỉ định trả về ['']."

Để kiểm tra các trường hợp này, khi bạn đang sử dụng một delimiter rõ ràng (như việc bạn sử dụng split(",")), làm một cái gì đó như thế này:

l = s.split(",") 

if len(l) == 1 and l[0] == '': 
    print("string was empty") 
1

Nếu trống rỗng là kết quả quan trọng, có lẽ tốt nhất để kiểm tra chuỗi gốc đầu tiên:

x = '' 
if x: 
    # Original string was non-empty, split it 
    splitx = x.split(',') 
    if any(splitx): 
     # There was at least one character in the original string that wasn't a comma 

các thử nghiệm quy tắc đầu tiên ra chuỗi ban đầu trống rỗng, điều thứ hai sử dụng any quy tắc ra chuỗi là gì, nhưng các nhân vật tách, và do đó trở lại một tổng thể bó chuỗi rỗng, nhưng không có chuỗi không trống. Miễn là bạn có một chuỗi không trống, nó sẽ chuyển.

Lưu ý: Trong trường hợp bạn đang cố gắng phân tích cú pháp tệp CSV, không sử dụng .split(','); có csv module xử lý chính xác (bao gồm thoát, trích dẫn, v.v.) và phải ALWAYS được sử dụng để phân tích cú pháp CSV, không bao giờ cuộn phân tích cú pháp của riêng bạn. Đã thêm tiền thưởng: csv sẽ chuyển đổi các đầu vào '' thành [] hàng mà bạn có thể kiểm tra tính trung thực trực tiếp, chứ không phải [''] như str.split. Ví dụ:

>>> import csv, io 

>>> f = io.StringIO('\n\na,b,c\n1,2,3\n\n') 
>>> [row for row in csv.reader(f) if row] # Stripping easily 
[['a', 'b', 'c'], ['1', '2', '3']] 

vs phương pháp tương tự với str.split(',') mà vẫn không xử lý trích dẫn, đào thoát, v.v .:

>>> f = io.StringIO('\n\na,b,c\n1,2,3\n\n') 
>>> stripped = (line.rstrip('\r\n') for line in f) # Must manually strip line endings first 
>>> [line.split(',') for line in stripped if line] 
[['a', 'b', 'c'], ['1', '2', '3']] 
Các vấn đề liên quan