2012-05-23 58 views
6

Tôi có một chuỗi như:tiền tố phù hợp trong python

" This is such an nice artwork" 

và tôi có một tag_list ["art","paint"]

Về cơ bản, tôi muốn viết một hàm mà chấp nhận chuỗi này và taglist như đầu vào và trả về cho tôi từ "tác phẩm nghệ thuật" làm tác phẩm nghệ thuật chứa từ nghệ thuật nằm trong danh sách từ khóa.

Làm cách nào để thực hiện điều này một cách hiệu quả nhất?

Tôi muốn đây là hiệu quả về tốc độ

def prefix_match(string, taglist): 
     # do something here 
    return word_in string 

Trả lời

7

Hãy thử như sau:

def prefix_match(sentence, taglist): 
    taglist = tuple(taglist) 
    for word in sentence.split(): 
     if word.startswith(taglist): 
      return word 

này hoạt động vì str.startswith() có thể chấp nhận một tuple các tiền tố như một cuộc tranh cãi.

Lưu ý rằng tôi đã đổi tên thành string thành sentence để không có bất kỳ sự mơ hồ nào với mô-đun chuỗi.

+0

hey @ Andrew, làm thế nào Nếu tôi muốn trả về chuỗi taglist không lời? – indi60

2

Hãy thử điều này:

def prefix_match(s, taglist): 
    words = s.split() 
    return [w for t in taglist for w in words if w.startswith(t)] 

s = "This is such an nice artwork" 
taglist = ["art", "paint"] 
prefix_match(s, taglist) 

trên sẽ trả về một danh sách tất cả các từ trong chuỗi phù hợp với một tiền tố trong danh sách các thẻ.

1

Đây là giải pháp khả thi. Tôi đang sử dụng regex, bởi vì tôi có thể loại bỏ các dấu câu dễ dàng theo cách này. Ngoài ra, tôi đang sử dụng collections.Counter điều này có thể thêm hiệu quả nếu chuỗi của bạn có nhiều từ lặp lại.

tag_list = ["art","paint"] 

s = "This is such an nice artwork, very nice artwork. This is the best painting I've ever seen" 

from collections import Counter 
import re 

words = re.findall(r'(\w+)', s) 

dicto = Counter(words) 

def found(s, tag): 
    return s.startswith(tag) 

words_found = [] 

for tag in tag_list: 
    for k,v in dicto.iteritems(): 
     if found(k, tag): 
      words_found.append((k,v)) 

Phần cuối cùng có thể được thực hiện với danh sách hiểu:

words_found = [[(k,v) for k,v in dicto.iteritems() if found(k,tag)] for tag in tag_list] 

Kết quả:

>>> words_found 
[('artwork', 2), ('painting', 1)] 
Các vấn đề liên quan