2015-02-22 17 views
6

substring tôi đã tự hỏi cách pythonic nhất để là những gì:Remove chuỗi từ danh sách nếu từ danh sách

Có một danh sách các chuỗi và một danh sách các chuỗi con loại bỏ các yếu tố của danh sách chuỗi chứa bất kỳ danh sách chuỗi con.

list_dirs = ('C:\\foo\\bar\\hello.txt', 'C:\\bar\\foo\\.world.txt', 'C:\\foo\\bar\\yellow.txt') 

unwanted_files = ('hello.txt', 'yellow.txt) 

đầu ra mong muốn:

list_dirs = (C:\\bar\\foo\.world.txt') 

Tôi đã cố gắng thực hiện những câu hỏi tương tự như this, nhưng tôi vẫn đang phải vật lộn làm cho việc di chuyển và mở rộng việc thực hiện cụ thể cho một danh sách.

Cho đến nay tôi đã làm điều này:

for i in arange(0, len(list_dirs)): 
    if 'hello.txt' in list_dirs[i]: 
     list_dirs.remove(list_dirs[i]) 

này hoạt động nhưng có lẽ nó không phải là cách sạch hơn và quan trọng hơn là nó không hỗ trợ một danh sách, nếu tôi muốn loại bỏ hello.txt hoặc yellow.txt tôi sẽ phải sử dụng một hoặc. Cảm ơn.

+0

@PM 2Ring Có, tôi đã sử dụng NumPy. arange tương tự như phạm vi – dudas

+0

Không an toàn để sửa đổi bộ sưu tập mà bạn đang lặp lại. –

Trả lời

2

Sử dụng list comprehensions

>>> [l for l in list_dirs if l.split('\\')[-1] not in unwanted_files] 
['C:\\bar\\foo\\.world.txt'] 

Sử dụng split để có được filename

>>> [l.split('\\')[-1] for l in list_dirs] 
['hello.txt', '.world.txt', 'yellow.txt'] 
+0

Tôi nghĩ nó hoạt động. Cảm ơn – dudas

+0

Nhìn gần hơn một chút ngay bây giờ. Việc triển khai này có yêu cầu tên tệp chính xác của các tệp không mong muốn hoặc chỉ là một chuỗi con không? Tôi đã thử nghiệm và có vẻ như yêu cầu tất cả tên tệp chính xác – dudas

+0

@dudas này yêu cầu tên tệp chính xác. – styvane

1

bạn cũng có thể sử dụng một chức năng lọc với lambda

print filter(lambda x: x.split('\\')[-1] not in unwanted_files, list_dirs) 
#['C:\\bar\\foo\\.world.txt'] 

hoặc nếu bạn không nhớ để nhập khẩu os (imo này là sạch hơn sau đó spli fitting chuỗi)

print filter(lambda x: os.path.basename(x) not in unwanted_files, list_dirs) 

Trong một sự hiểu biết danh sách nó sẽ trông như thế này

[l for l in list_dirs if os.path.basename(l) not in unwanted_files] 
Các vấn đề liên quan