2009-07-16 31 views
9

Trong Python, tôi có một danh sách các chuỗi, một số có thể là chuỗi rỗng. Cách tốt nhất để lấy chuỗi không trống đầu tiên là gì?Nhận chuỗi không trống đầu tiên từ danh sách trong python

+0

Bạn có muốn tham chiếu đến chuỗi trống đầu tiên hoặc bạn có muốn xóa tất cả các chuỗi trống khỏi danh sách không? Danh sách này có được tạo ra từ một chuỗi phân tách bởi bất kỳ cơ hội nào không? –

+0

Được tạo từ regex: matches = re.findall (r "foo (\ d +) | thanh (\ d +)") - Tôi muốn chuỗi không trống đầu tiên, nhưng sẽ quan tâm đến cách xóa tất cả các chuỗi rỗng (regex có thể lâu hơn). –

+0

tiêu đề câu hỏi của bạn không tương ứng với nội dung câu hỏi của bạn. Sửa một trong số chúng. – SilentGhost

Trả lời

18
next(s for s in list_of_string if s) 

Edit: py3k phiên bản giấy tờ chứng minh như tư vấn bởi Stephan202 trong ý kiến, cảm ơn.

+0

'[]' được gọi là danh sách hiểu. – SilentGhost

+0

sẽ không hoạt động trong phiên bản py3k – SilentGhost

+2

py3k: 'next (s cho s trong list_of_string nếu s)'. – Stephan202

5

Để loại bỏ tất cả các chuỗi rỗng,

[s for s in list_of_strings if s]

Để có được chuỗi không rỗng đầu tiên, chỉ cần tạo danh sách này và nhận được phần tử đầu tiên, hoặc sử dụng các phương pháp lười biếng theo đề nghị của wuub.

+0

một dòng FTW! Tôi thích nó. – Randolpho

+5

Một chút không hiệu quả, mặc dù! Nếu bạn có một triệu bản trống không trống chỉ sau một bản trống, bạn sẽ dành nhiều thời gian và bộ nhớ tạo ra một danh sách một triệu chuỗi, chỉ để có được cái đầu tiên ... Ít nhất, hãy dùng máy phát điện! – Mapio

3
def get_nonempty(list_of_strings): 
    for s in list_of_strings: 
     if s: 
      return s 
+1

Ít sang trọng hơn so với máy phát hiểu được đề xuất ở trên, cũng cho biết thêm sự phức tạp hơn đối với tệp soruce. –

+1

sang trọng trong con mắt của kẻ đối xử, Daniel. Nó hoạt động hoàn hảo không giống như phiên bản của câu trả lời được chấp nhận: đó là điều quan trọng – SilentGhost

0

để nhận chuỗi đầu tiên không trống trong danh sách, bạn chỉ cần lặp lại chuỗi đó và kiểm tra xem nó có trống không. Thats tất cả để có nó.

arr = ['','',2,"one"] 
for i in arr: 
    if i: 
     print i 
     break 
2

Đây là một cách ngắn gọn:

filter(None, list_of_strings)[0] 

EDIT:

Dưới đây là một hơi dài như vậy là tốt hơn:

from itertools import ifilter 
ifilter(None, list_of_strings).next() 
+0

Tại sao cách thứ hai tốt hơn? –

+0

Điều này chỉ hoạt động trong Python 2.x và kém hiệu quả hơn ví dụ về trình tạo, vì 'bộ lọc' lặp lại toàn bộ danh sách, bất kể nội dung. Trong py3k 'filter' trả về một đối tượng lọc, không thể mô tả được. – Stephan202

+0

@Fred: Cách đầu tiên sẽ đi qua và lọc ra mọi chuỗi trống, tạo danh sách mới và chọn kết quả đầu tiên. Cách thứ hai sẽ đi qua danh sách lọc ra các chuỗi rỗng cho đến khi tìm thấy chuỗi trống đầu tiên và sẽ trả lại. Không có danh sách trung gian nào được tạo. Ví dụ: nếu bạn có danh sách 10.000 chuỗi và chỉ có chuỗi đầu tiên trống, phương pháp đầu tiên sẽ tạo danh sách mới 9999 chuỗi trong bộ nhớ trong khi chuỗi thứ hai không có. –

0

Dựa trên câu hỏi của bạn tôi sẽ phải giả sử rất nhiều, nhưng để "lấy" chuỗi không trống đầu tiên:

(i for i, s in enumerate(x) if s).next() 

trả về chỉ mục của nó trong danh sách. Các 'x' ràng buộc chỉ vào danh sách các chuỗi của bạn.

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