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)






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()
@thelogicalkoan исправлено
Проблема в вашем коде заключается в том, что вы пытаетесь присвоить одно значение двум переменным, здесь 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
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()
Следует отметить, что [word1, word2] = text.split() вызовет ту же ошибку, если text содержит более одного пробела, и противоположную ошибку, если он вообще не содержит пробелов.
@DeepSpace Конечно, но в таком случае этого следовало ожидать, не так ли? Когда я его читал, OP был сбит с толку из-за ошибки именно потому, что text.split() должен возвращать два элемента для данного ввода. Я не думаю, что OP ожидал, что код будет работать для входов с более или менее одним пробелом. Другими словами: с [word1, word2] = text.split() код делает то, что OP ожидал от оригинала: сравнивает первые буквы двух слов в строке или вызывает ошибку, если слов меньше или больше. Во всяком случае, это моя интерпретация вопроса.
@ sepp2k, это совершенно верно, код предназначен только для строк из 2 слов, поэтому ожидается только один пробел.
Это должен быть
for [word1, word2] in [['a', 'b'], ['c', 'd']], вы пропустили закрывающую скобку.