2010-08-18 38 views
9

Xin lỗi nếu câu hỏi có chút khó hiểu. Điều này tương tự như this questionCách xóa danh sách các từ khỏi danh sách các chuỗi

Tôi nghĩ câu hỏi trên gần với những gì tôi muốn, nhưng trong Clojure.

another câu hỏi

tôi cần một cái gì đó như thế này nhưng thay vì '[br]' trong câu hỏi đó, có một danh sách các chuỗi mà cần phải được tìm kiếm và loại bỏ.

Hy vọng tôi đã tự làm rõ.

Tôi nghĩ rằng điều này là do thực tế rằng các chuỗi trong python là không thay đổi.

Tôi có danh sách các từ tiếng ồn cần được xóa khỏi danh sách các chuỗi.

Nếu tôi sử dụng tính năng đọc danh sách, tôi sẽ tìm kiếm cùng một chuỗi một lần nữa. Vì vậy, chỉ "của" được loại bỏ và không phải là "the". Vì vậy danh sách đã sửa đổi của tôi trông giống như thế này

places = ['New York', 'the New York City', 'at Moscow' and many more] 

noise_words_list = ['of', 'the', 'in', 'for', 'at'] 

for place in places: 
    stuff = [place.replace(w, "").strip() for w in noise_words_list if place.startswith(w)] 

Tôi muốn biết tôi đang làm gì sai.

+1

là gì 'place'? – katrielalex

+0

Bạn không làm cho mình rõ ràng; nêu câu hỏi của bạn * tại đây *, và sau đó đặt các liên kết đến các câu hỏi tương tự với các câu trả lời tương tự nếu bạn nghĩ rằng điều đó là cần thiết bên dưới. –

Trả lời

9

Đây là lỗi của tôi. Điều này sử dụng cụm từ thông dụng.

import re 
pattern = re.compile("(of|the|in|for|at)\W", re.I) 
phrases = ['of New York', 'of the New York'] 
map(lambda phrase: pattern.sub("", phrase), phrases) # ['New York', 'New York'] 

Sans lambda:

[pattern.sub("", phrase) for phrase in phrases] 

Cập nhật

Fix for lỗi chỉ ra bởi gnibbler (nhờ!):

pattern = re.compile("\\b(of|the|in|for|at)\\W", re.I) 
phrases = ['of New York', 'of the New York', 'Spain has rain'] 
[pattern.sub("", phrase) for phrase in phrases] # ['New York', 'New York', 'Spain has rain'] 

@prabhu: sự thay đổi trên tránh cắt đuôi "trong "từ" Tây Ban Nha ". Để xác minh chạy cả hai phiên bản của cụm từ thông dụng với cụm từ "Tây Ban Nha có mưa".

+0

Cảm ơn. Nó hoạt động theo cách này. Tôi đã có thể hiểu được khái niệm về lambda rõ ràng hơn bây giờ khi tôi có cơ hội để thực hiện điều này. – prabhu

+1

Điều này không hoạt động đúng với cụm từ "Tây Ban Nha có mưa". Thật dễ dàng để sửa lỗi mặc dù –

+0

@Gnibbler: cảm ơn vì đã chỉ ra. Đang thay đổi câu trả lời của tôi cho phù hợp. –

3
>>> import re 
>>> noise_words_list = ['of', 'the', 'in', 'for', 'at'] 
>>> phrases = ['of New York', 'of the New York'] 
>>> noise_re = re.compile('\\b(%s)\\W'%('|'.join(map(re.escape,noise_words_list))),re.I) 
>>> [noise_re.sub('',p) for p in phrases] 
['New York', 'New York'] 
+0

Wow! Đó là một cách thực sự tuyệt vời, mặc dù tôi đã căng thẳng bộ não của mình. :-) – prabhu

+0

Điều này dường như không nhận được mọi trường hợp của từ. Ví dụ: "của New York" trở thành "New York of". – Namey

+1

@Namey, bạn có thể sử dụng một cái gì đó như ''\\ W? \\ b (% s) \\ W?''. Nếu không có OP cung cấp một tập hợp toàn diện các testcases, nó là một chút của một whack-a-nốt ruồi –

1

Vì bạn muốn biết những gì bạn đang làm sai, dòng này:

stuff = [place.replace(w, "").strip() for w in noise_words_list if place.startswith(w)] 

diễn ra, và sau đó bắt đầu để lặp qua lời nói. Đầu tiên nó kiểm tra "của". Địa điểm của bạn (ví dụ: "của New York") được chọn để xem nó có bắt đầu bằng "của" hay không. Nó được chuyển đổi (gọi để thay thế và dải) và thêm vào danh sách kết quả. Điều quan trọng ở đây là kết quả không bao giờ được kiểm tra lại. Đối với mỗi từ bạn lặp lại trong hiểu, kết quả mới được thêm vào danh sách kết quả. Vì vậy, từ tiếp theo là "the" và vị trí của bạn ("của New York") không bắt đầu bằng "the", do đó không có kết quả mới nào được thêm vào.

Tôi cho rằng kết quả cuối cùng bạn nhận được là nối các biến vị trí của bạn. Một đơn giản để đọc và hiểu được phiên bản thủ tục sẽ là (chưa được kiểm tra):

results = [] 
for place in places: 
    for word in words: 
     if place.startswith(word): 
      place = place.replace(word, "").strip() 
    results.append(place) 

Hãy ghi nhớ rằng replace() sẽ loại bỏ từ bất cứ nơi nào trong chuỗi, thậm chí nếu nó xảy ra như một chuỗi đơn giản. Bạn có thể tránh điều này bằng cách sử dụng regexes với một mẫu giống như ^the\b.

+0

Cảm ơn. Điều đó rất hữu ích. – prabhu

14

Without regexp bạn có thể làm như thế này:

places = ['of New York', 'of the New York'] 

noise_words_set = {'of', 'the', 'at', 'for', 'in'} 
stuff = [' '.join(w for w in place.split() if w.lower() not in noise_words_set) 
     for place in places 
     ] 
print stuff 
+0

Tuyệt vời! Cảm ơn bạn! – prabhu

+0

Tôi đã xem qua điều này và không có ý tưởng gì đang xảy ra ở đây. Nếu bất cứ ai tình cờ gặp điều này và tự hỏi ma thuật nào đang xảy ra, nó được gọi là danh sách hiểu và đây là một bài viết giải thích nó http://carlgroner.me/Python/2011/11/09/An-Introduction-to-List-Comprehensions- in-Python.html –

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