Списки Python и совпадения элементов списка - можно ли улучшить мой код / ​​аргументацию? - PullRequest
2 голосов
/ 22 сентября 2010

уровень запроса: начинающий

В качестве части учебного упражнения я написал код, который должен проверять, соответствует ли строка (в том виде, как она создается через raw_input) началу любого элемента списка и равна ли он какому-либо элементу списка.

wordlist = ['hello', 'bye'] 
handlist = [] 
letter = raw_input('enter letter: ') 
handlist.append(letter) 
hand = "".join(handlist) 
for item in wordlist: 
    if item.startswith(hand): 
        while item.startswith(hand): 
            if hand not in wordlist: 
                letter = raw_input('enter letter: ') 
                handlist.append(letter) 
                hand = "".join(handlist) 
            else: break 
        else: break 
print 'you loose' 

Этот код работает, но как улучшить мой код (и мои рассуждения / подход)? У меня такое чувство, что мое вложение операторов IF, WHILE и FOR излишне.

EDIT Благодаря Дэйву я смог значительно сократить и оптимизировать мой код.

wordlist = ['hello','hamburger', 'bye', 'cello']
hand = ''
while any(item.startswith(hand) for item in wordlist):
    if hand not in wordlist:
        hand += raw_input('enter letter: ')
    else: break
print 'you loose' 

Я удивлен, что мой оригинальный код работал вообще ...

1 Ответ

7 голосов
/ 22 сентября 2010

Во-первых, вам не нужна переменная handlist;Вы можете просто объединить значение raw_input с hand.

. Вы можете сохранить первый raw_input, запустив цикл while с hand как пустую строку, поскольку каждая строка имеет startswith("") as True.

Наконец, нам нужно найти лучший способ проверить, начинается ли какой-либо из элементов в wordlist с hand.Для этого мы могли бы использовать понимание списка:

[item for item in wordlist if item.startswith(hand)]

, а затем проверить длину возвращаемого списка, если оно больше нуля.

Однако, еще лучше, в python есть функция any() , которая идеально подходит для этого: она возвращает True, если какой-либо элемент итерируемого элемента равен True, поэтому мы простоstartswith() для каждого члена wordlist.

Собрав все это вместе, мы получим:

wordlist = ['hello', 'bye'] 
hand = ""

while any(item.startswith(hand) for item in wordlist):
    hand += raw_input('enter letter: ')  
print 'you loose' 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...