2016-04-30 1 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

Вы должны попытаться самостоятельно отладить эти проблемы, разбив то, что происходит на каждом шаге. Печать переменных на каждом этапе или игра с оболочкой или отладчиком, такая как 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]) 

Обратите внимание, что прямая петля работает в этой ситуации; нет необходимости использовать range и индексировать вручную. Использование оператора and также является более чистым, чем вложенные операторы if.

Это достаточно эффективно, как только PEOPLE имеет несколько десятков миллионов элементов. Если вы доберетесь до этого этапа, вы можете изучить методы индексирования поисковых систем.

1

Как насчет того, чтобы сделать класс Person? Это просто, легко читается и легко управляется.

Например, я написал класс Person с методом get_role. Напишите свой собственный метод 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 Рад, что это помогло. Если вы чувствуете, что ответ удовлетворяет вашему вопросу, вы можете подумать о принятии ответа, вместо того, чтобы упоминать его в вопросе. Это поможет другим пользователям. –

Смежные вопросы