Python string.split более одного значения в цикле for - PullRequest
3 голосов
/ 18 февраля 2011

В основном это работает нормально:

>>> x,y = "x=y".split("=")
>>> print x
x

Но это выдает ошибку:

>>> for x, y in "x=y".split("="):
...     print x
...

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: need more than 1 value to unpack

Мне интересно, в чем разница, и как я могу исправить это для цикла.

Ответы [ 4 ]

10 голосов
/ 18 февраля 2011

Разделение на "=" дает два значения:

"x", "y"

Тот факт, что эти значения соответствуют именам переменных, является случайным.Вы также можете сделать:

x,xx = "x=y".split("=")

Я подозреваю, что вы, вероятно, планируете взять список:

"foo=bar,blah=boo,etc=something"

и разделить его, для чего вы можете сделать:

for x,y in [ (pair.split("=")) for pair in "foo=bar,blah=boo,etc=something".split(",") ]:
    print x,y

НО!Хотя это работает, я думаю, что было бы гораздо лучше разбить его на отдельные этапы, поскольку оно гораздо более читабельно:

params = "foo=bar,blah=boo,etc=something"
pair_list = params.split(",")
for pair in pair_list:
    x,y = pair.split("=")
    ...
3 голосов
/ 18 февраля 2011

Вы могли бы сделать

for x in "x=y".split("="):
    # ...

То, что вы пытались сделать, - это перебрать последовательность ["x", "y"], но назначить x, y для каждой записи последовательности. Это было бы эквивалентно

 x, y = "x"

для первой итерации, которая не имеет никакого смысла.

2 голосов
/ 18 февраля 2011

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

>>> for x, y in ["x=y".split("=")]:
...   print x
...   print y
... 
x
y
0 голосов
/ 18 февраля 2011

Потому что функция разделения возвращает список. В контексте цикла for он получает по одному элементу за раз. Например: 'k=y'.split('=') возвращает список, содержащий ['k', 'y']. Поскольку он находится в цикле for, вы получаете «k», а затем «y».

Причина, по которой он работает вне цикла for, заключается в том, что он видит весь список за раз вместо одного элемента в цикле for и может распаковать его.

Чтобы исправить это, вы можете разбить данные на список кортежей вне цикла for и пройти через них. Например: [('x', 'y'), ...]

...