Почему это возвращает более двух значений? - PullRequest
0 голосов
/ 25 декабря 2018
def animal_crackers(text):
   for [word1, word2] in text.split():
        if word1[0]==word2[0]:
            return true
        else:
            pass

animal_crackers('Levelheaded Llama')

ValueError                                Traceback (most recent call last)
<ipython-input-21-bfc977603445> in <module>()
      5         else:
      6             pass
----> 7 animal_crackers('Levelheaded Llama')

<ipython-input-21-bfc977603445> in animal_crackers(text)
      1 def animal_crackers(text):
----> 2    for [word1, word2] in text.split():
      3         if word1[0]==word2[0]:
      4             return true
      5         else:

ValueError: too many values to unpack (expected 2)

Ответы [ 3 ]

0 голосов
/ 25 декабря 2018

Проблема в вашем коде в том, что вы пытаетесь присвоить одно значение двум переменным, здесь text.split() равно ['Levelheaded', 'Llama'], и поэтому первые элементы элементов, которые вы будете перебирать, будут 'Levelheaded', и вы пытаетесь назначить вдвум переменным word1 и word2.

Вместо этого вы можете назначить их без итерации, также измените true на True.

def animal_crackers(text):
    word1, word2 = text.split()
    if word1[0] == word2[0]:
        return True

print(animal_crackers('Levelheaded Llama')) # -> True
0 голосов
/ 25 декабря 2018

text.split() возвращает ['Levelheaded', 'Llama'], поэтому мы получаем:

for [word1, word2] in ['Levelheaded', 'Llama']:
    if word1[0]==word2[0]:
        return true
    else:
        pass

Теперь, когда мы знаем, что имеем цикл над списком из двух элементов, мы можем развернуть цикл следующим образом:

# First iteration
[word1, word2] = 'Levelheaded'
if word1[0]==word2[0]:
    return true
else:
    pass

# Second iteration
[word1, word2] = 'Llama'
if word1[0]==word2[0]:
    return true
else:
    pass

Теперь что-то вроде [word1, word2] = 'Levelheaded' будет обрабатывать строку как список символов, но, поскольку слова содержат более двух символов, вы получите ошибку.

Поскольку вы на самом деле не хотитечтобы зациклить что-либо, вы должны избавиться от цикла for и просто написать:

[word1, word2] = text.split()
0 голосов
/ 25 декабря 2018

split возвращает список строк, крайний регистр - это список с одной строкой, если строка не содержит строку, используемую в качестве разделителя.

Сказав for [word1, word2] in text.split(), вы по существу ожидаетечтобы вернуть список списков, как в следующем примере:

for [word1, word2] in [['a', 'b'], ['c', 'd']]:
    print(word1, word2)

выведет

a b
c d

У вас есть два варианта:

  • Возьмите каждый элемент по отдельности:

    for word in 'Levelheaded Llama'.split():
        print(word)
    
  • Используйте распаковку (только если вы знаете наверняка text всегда будет иметь один пробел или если вы ожидаетев противном случае получите ошибку):

    word1, word2 = text.split()
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...