2016-04-30 146 views
2

首先,你知道爲什麼這個代碼根本不起作用嗎?當我給它的輸入是「當史蒂夫出生的時候」,它什麼都沒有返回。其次,我幾乎可以肯定,這可以用一種更有效的方式編寫,這將使程序執行所需的時間更少。有任何想法嗎?謝謝!檢查字符串是否包含嵌套列表的值 - python

import sys 

Bill_Gates = ["bill gates","1955", "Co-founder of Microsoft"] 
Steve_Jobs = ["steve jobs","1955", "Co-Founder of Apple"] 
Albert_Einstein = ["albert einstein","1879", "Phycisist"] 

PEOPLE = [Bill_Gates, Steve_Jobs, Albert_Einstein] 

userInput = input("say something") 

#checking if userInput contains the peoples name 
if userInput in [j for i in PEOPLE for j in i]: 
    for i in range(len(PEOPLE)): 
     if PEOPLE [i][0] in userInput: 
      if "when was" in userInput: 
       if "born" in userInput: 
        print(PEOPLE[i][0] + "was born in " + PEOPLE[i][1]) 

UPDATE: Ahsanul哈克給我只是回答我正在尋找。

回答

2

'when was steve jobs born'不在您創建的列表中,無論它是什麼;由於外部if失敗,它內部沒有任何執行。

4

你應該嘗試通過分解每一步發生的事情來自己調試這些類型的問題。在每個階段打印變量或者使用shell或調試器(例如pdb)進行操作都非常有幫助。在這種情況下:

>>> Bill_Gates = ["bill gates","1955", "Co-founder of Microsoft"] 
>>> Steve_Jobs = ["steve jobs","1955", "Co-Founder of Apple"] 
>>> Albert_Einstein = ["albert einstein","1879", "Phycisist"] 
>>> 
>>> PEOPLE = [Bill_Gates, Steve_Jobs, Albert_Einstein] 
>>> things = [j for i in PEOPLE for j in i] 
>>> things 
['bill gates', '1955', 'Co-founder of Microsoft', 'steve jobs', '1955', 'Co-Founder of Apple', 'albert einstein', '1879', 'Phycisist'] 
>>> 'steve jobs' in things 
True 
>>> 'when was steve jobs born' in things 
False 

所以if userInput in [j for i in PEOPLE for j in i]失敗,因爲右側僅僅是一個字符串列表和Python是不是魔術。

無論如何,你的代碼幾乎都有,因爲它沒有初始檢查就可以工作。所以這個工程:

for person in PEOPLE: 
    if person[0] in userInput and "when was" in userInput and "born" in userInput: 
     print(person[0] + " was born in " + person[1]) 

請注意,直接for循環在這種情況下工作;沒有必要手動使用range和索引。使用and運算符也比嵌套的if語句更清潔。

這是很有效的,除非PEOPLE有幾千萬的元素。如果你到了這個階段,你可以看看搜索引擎索引技術。

1

如何製作Person課程?它簡單易讀,易於管理。

例如,我用get_role方法編寫了Person類。寫自己的get_name()get_year_of_birth方法。

class Person: 
    def __init__(self, name, year_of_birth, role): 
     self.name = name 
     self.year_of_birth = year_of_birth 
     self.role = role 

    def get_role(self): 
     return self.role 

Bill_Gates = Person("bill gates","1955", "Co-founder of Microsoft") 
Steve_Jobs = Person("steve jobs","1955", "Co-Founder of Apple") 
Albert_Einstein = Person("albert einstein","1879", "Phycisist") 


person_list= [Bill_Gates,Steve_Jobs,Albert_Einstein] 


for person in person_list: 
    print person.get_role() 

輸出:

Co-founder of Microsoft 
Co-Founder of Apple 
Phycisist 
+0

感謝,正是我一直在尋找。 –

+1

@UlrikKarlsson很高興它有所幫助。如果你覺得答案滿足你的問題,你可以考慮接受答案,而不是在問題中提及它。這將有助於其他用戶。 –

相關問題