2016-04-30 141 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很高兴它有所帮助。如果你觉得答案满足你的问题,你可以考虑接受答案,而不是在问题中提及它。这将有助于其他用户。 –

相关问题