2016-12-14 51 views
0

假設我有一個數據集這樣如何使一個定義功能來找到特定的符號

Language: English 

Place: Seattle 

Segments: b,p,m,d,t 


Language: Mandarin 

Place: HK 

Segments: n,i,o,h 


Language: Cantonese 

Place:HK 

Segments:l,e,h,o 

並繼續有這樣的模式。

我該如何制定一個定義函數來檢查特定城市的語言。

我至今爲:(儘管這是不對的) 語言=名單()

def lang_from(location): 
    file=open("data.txt") 
    lang = file.readline().replace("/n", "").replace("Language:", "") 
    city = file.readline().replace("/n", "").replace("Place:", "") 
    seg = file.readline().replace("/n", "").replace("Segments:", "") 
    for place in file: 
     if location in place: 
      languages.append(language.lang) 
     else: 
      break 

我希望我的輸入是:

print(lang_from("HK")) 

和輸出是

 Cantonese, Mandarin 

回答

0

也許正則表達式是最簡單的方法(雖然它可能很難找到邊緣案例:

import re 

def lang_from(location): 

    pattern = 'Language:\s*(\w+)\s*Place:\s*{}'.format(location) 
    with open('data.txt', 'r') as f: 
     print(re.findall(pattern, f.read())) 

if __name__ == '__main__': 

    lang_from('HK') 
# prints ['Mandarin', 'Cantonese'] 

你可以修改正則表達式here

0

拆分的原始數據在兩次換行,你會得到

Language: English 

Place: Seattle 

Segments: b,p,m,d,t 

修剪空線

Language: English 
Place: Seattle 
Segments: b,p,m,d,t 

result_list = your_string.split('\n').rstrip()

['Language: English','Place: Seattle','Segments: b,p,m,d,t'] 

作出這樣一個循環:

dict = {} 
for r in result_list: 
    item = r.split(':') 
    key = item[0] # Language 
    value = item[1].strip() # English 
    dict[key] = value 

在這一點上,你有一個很好的結構化字典,你可以很容易地過濾。

{ 
'Language': 'English', 
'Place': 'Seattle', 
'Segments': 'b,p,m,d,t' 
} 

我將如何做一個定義功能,將檢查什麼 語文特定城市了。

def get_language_for(city): 
    return [ v['Language'] for k, v in dict.items() if v['Place'] == city ][0] 
+0

據我所知,這不是正確的答案。但只有很小的編輯才能解決它。檢查問題中的空格。你的代碼在'Place:HK'和'Place:HK'之間沒有區別。在'for'循環的'value'上使用'str.strip()'應該可以解決這個問題。 – quapka

+1

是的,我忽略了,但它只是一個空間兄弟:) –

+0

是啊,我不想聽起來那麼迂腐,對此感到抱歉。但是,它只是一個空間,可能會導致很多不必要的問題,而這些問題可能很難找到。所以我有點訓練自己來提前免除這些麻煩。 – quapka

相關問題