2015-08-20 6 views
0

У меня есть кортеж, содержащие строки и список строки, как показано ниже:Python - слишком много значений для распаковки

test = ('str1',['1', '2']) 
for a,b in test: 
    print(a,b) 

Я хочу, чтобы распаковать таким образом, что я могу получить [(«str1»,» 1 '), (' str1 ',' 2 ')].

Однако я получаю «ValueError: слишком много значений для распаковки (ожидается 2)».

Если я печатаю длину теста, он приходит как 2. Поэтому не уверен, что здесь не так.

+0

Первый элемент вашего кортежа '» str1 "', второй - список '[" 1 "," 2 "]' .. – nbro

ответ

1

Хотя test имеет два элемента, вы пытаетесь выполнить итерацию по кортежам, что не будет работать, потому что test не имеет кортежей (это сам кортеж).

Так это работает:

test = [('str1',['1', '2'])] 
for a,b in test: 
    print(a,b) 

Или, чтобы получить то, что вы хотите, как список:

print([(test[0], item) for item in test[1]]) 

Вы также можете перемещаться таким образом:

test = ('str1',['1', '2']) 
for item in test[1]: 
    print(test[0], item) 
+0

Спасибо. В чем принципиальная разница между итерацией над кортежами и повторением списка? – jincept

+0

Нет, вам нужно только убедиться, что вы повторяете вещи, которые вы можете распаковать, как вы указали. –

0

Ваш код выполняет итерацию по каждому элементу в test; сначала 'str1', затем ['1', '2']. Проблема в том, что вы пытаетесь сделать a, b = 'str1' (это то, что делает цикл for). Значения 4 в 'str1', но только две переменные, к которым вы пытаетесь их назначить.

Вот один из способов сделать то, что вы на самом деле хотите:

test = ('str1',['1', '2']) 

test_str, test_list = test 

for b in test_list: 
    print(test_str, b) 

В этом коде test_str является 'str1' и test_list является ['1', '2']. Затем вы перебираете test_list и просто указываете test_str, чтобы получить 'str1'.

1

" Слишком много значений для распаковки "означает именно это. Давайте посмотрим на элементы в test:

test = ('str1',['1', '2']) 
for a,b in test: 
    print(a,b) 

Каждый элемент test будет распакован в две переменные. Первый элемент - 'str1', а второй - ['1', '2']. 'str1' - это строка с четырьмя символами, поэтому без распаковки ей потребуется четыре переменные. Однако вы предоставляете только два, a и b. Это ошибка.

Чтобы получить вывод, который вы хотите, я рекомендую распаковывать следующим образом:

a,b = test 

Теперь a является 'str1' и b является ['1', '2'].Вы можете перебрать значения в b:

for item in b: 
    print(a, item) 

Результат:

str1 1 
str1 2 
2

Вы можете использовать zip функцию, чтобы осуществить это:

>>> seq = ['1', '2'] 
>>> print(zip(['str']*len(seq), seq)) 
[('str', '1'), ('str', '2')] 

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

  • Нет связанных вопросов^_^