2017-07-24 38 views
2

我試圖通過使用第一,第二和最後一個名稱來匹配名稱,或者以正確的順序或不使用所有這些名稱。到目前爲止,我已經得到了這個代碼,它有點作品,但我認爲這不是正確的做法。你知道另一種做法嗎?Pythonic的方式來匹配一個字符串,如果包含在一組字符串中

數據的名稱設置是這樣的:

name = 'DAVID SCOTT MUSTAIN' 

我要的是,如果我搜索以匹配名稱,'MUSTAIN SCOTT''SCOTT DAVID'等。 功能我至今長相像這樣:

def search_name(somename): 
    for full_name in some_dataset: 
     if set(somename.upper().split()).issubset(full_name.split()): 
      print('match:', full_name) 

如果我輸入類似'DAV''SCOT',這將不匹配任何東西。即使姓名不完整,我應該如何繼續進行比賽?如果我將 這些名字分成單個字母,它會將每個名字與這些字母匹配,而不檢查字母的順序。

+0

聽起來像一個[後綴樹](https://en.wikipedia.org/wiki/Suffix_tree)可能會讓你感興趣。 – skrx

回答

2

您可以使用any檢查是否在somename任何名稱的任何名稱的full_name

def search_name(somename): 
    for full_name in some_dataset: 
     if any(n.upper() in fn for n in somename.split() for fn in full_name.split()): 
      print('match:', full_name) 

一個子集,這裏是使用sum和字典挑名字用一個例子最相符:

def search_name(somename): 
    matches = {} 
    for full_name in some_dataset: 
     matches[full_name] = sum(1 for n in somename.split() for fn in full_name.split() if n.upper() in fn) 
    best_matches = [k for k,v in matches.items() if v == max(matches.values()) if v != 0] 
    for match in best_matches: 
     print('match:', match) 

我敢肯定有更好的方法來寫這個功能,但我很睡眠剝奪..
至於你的第二個問題,也許你可以打印/返回best_matches列表中的所有項目?

+0

這場比賽不完整的名字,但如果我輸入'大衛斯科特'它匹配所有'斯科特的,即使他們不是'大衛的 –

+0

我明白了。在這種情況下,使用'sum'函數並打印出最匹配的名稱(如果有的話) –

+0

我對你的意思有了一個概念,但我不知道如何實現它,你可以將它添加到答案中嗎?(對於麻煩抱歉),還有,如果有兩個名字不同的'DAVID SCOTT',會發生什麼?假設名字沒有索引號碼來存儲,然後尋找它們,它們將具有相同的*匹配相似性*因此,如果我存儲最大似然度,它將覆蓋最後一個,並且如果我將集合存儲在集合中,我沒有辦法以後搜索這些名字。 –

1

我做的,使用更多的語句

def search_name(name, toSearch, num = 2): 
    found = [] 
    for word in name.split(): 
     search = word[:num] 
     for letter in word[num:]: 
      search += letter 
      isThere = [data for data in toSearch.split() if data in search] 
      if isThere: 
       found += isThere 
       break 
    return len(toSearch.split()) == len(found) 

name = 'DAVID SCOTT MUSTAIN' 
if search_name(name,'TA'): 
    print(name) 
else: 
    print('Nothing') 

你想這一點功能?

+0

我測試了一個無序的字符串進行搜索,它的工作原理,你能更好地解釋我的問題,也許有一個代碼? – kip

+0

我遇到過,它不會與每個組合匹配,即時通訊假設它爲'number'參數,如果我嘗試匹配''TA',它不匹配名稱。編輯:我刪除了我最後的評論,因爲它不是我的意思,我搞砸了的話。 –

+0

我編輯答案,我改變了我搜索比賽的那一行,現在測試它的代碼 – kip

0

我可能會使用

if full_name in somename and not set(full_name.split()) - set(someone.split()) 

,看看它的一個子串,它不包含任何額外的短名稱。

相關問題