Tôi có một chức năng để chọn ra cục u từ một danh sách các chuỗi và trả lại như một danh sách khác:Làm thế nào để sử dụng lại đối tượng phù hợp trong một sự hiểu biết danh sách
def filterPick(lines,regex):
result = []
for l in lines:
match = re.search(regex,l)
if match:
result += [match.group(1)]
return result
Có cách nào để tái cấu trúc này như một danh sách bao quát? Rõ ràng nó khá rõ ràng; chỉ tò mò thôi.
Nhờ những người đã đóng góp, đề cập đặc biệt đến @Alex. Đây là một phiên bản cô đọng của những gì tôi đã kết thúc; phương pháp phù hợp với regex được chuyển cho filterPick như là một "tiền treo" tham số:
import re
def filterPick(list,filter):
return [ (l, m.group(1)) for l in list for m in (filter(l),) if m]
theList = ["foo", "bar", "baz", "qurx", "bother"]
searchRegex = re.compile('(a|r$)').search
x = filterPick(theList,searchRegex)
>> [('bar', 'a'), ('baz', 'a'), ('bother', 'r')]
Alex, tôi thích điều đó; cảm ơn và +1. Tôi có một số nâng khá nặng để làm với mã này - tôi nên lo lắng về chi phí phụ của thiết lập và xé xuống "iterator giả"? BTW Tôi đăng ký học thuyết "tối ưu hóa sau". –
@Brent, "trình lặp giả" sẽ không đáng kể wrt cuộc gọi tìm kiếm; một tối ưu hóa nhỏ là sử dụng '(regex.search (l),)' thay cho '[regex.search (l)]' (mà tôi thấy dễ đọc hơn nhưng chậm hơn - tôi nghĩ bạn không thể trong một vội vàng như bạn đã thực sự gọi hàm 're.search' từ mô-đun chứ không phải là phương thức của đối tượng re. Kéo' regex.search' như là một phương thức ràng buộc bên ngoài listcomp là một tối ưu hóa nhỏ nhưng hữu ích khác, btw. –
ngay sau khi tôi nhìn thấy câu trả lời của bạn tôi nhận ra rằng bằng cách sử dụng re.search không phải là cách tốt nhất để đi.Bạn có thể làm rõ cho tôi như thế nào bạn sẽ "[kéo] regex.search như một phương pháp ràng buộc bên ngoài của listcomp"? Tôi thực sự đánh giá cao sự kiên nhẫn của bạn với một listcomp và Python noob –