如果只能分配a和b,我怎么做a,b,c = x.split(“”)而不会崩溃?

时间:2015-05-29 11:15:04

标签: python

a = munching mcdonalds

a,b,c = a.split(" ")

Traceback (most recent call last):
  File "terminal.py", line 25, in <module>
    a,b,c = a.split(" ")
ValueError: need more than 1 value to unpack

如果我希望代码为2或3个单词且仍能打印a,我应该使用哪些代码?

5 个答案:

答案 0 :(得分:8)

如果您实际上需要 bc,您可以执行以下操作:

 

>>> sentence = 'munching macdonalds'
>>> first, rest = sentence.split(' ', 1)
>>> first
'munching'
>>> rest
'macdonalds'

这使用maxsplit的{​​{1}}参数(请参阅the docs)来限制第一个空格的分割。

然后你可以做str.split确定是否可以进一步拆分第二部分。

如果您使用的是Python 3,则可以使用if ' ' in rest:表示法进行整个拆分,使*为字符串,first为列表:

rest

答案 1 :(得分:1)

此版本很容易重复,并为您提供左侧所有变量的值,以防您以后决定要使用它们(而不只是a)。请注意,它也会修改原始列表,以便以后可以根据需要使用它。

def pad(iterable, length=0, padding=None):
    li = list(iterable)  # Generate new list from `iterable`.
    li.extend([padding] * (length - len(li)))  # Negative value generates empty list...
    return li

sentence = 'munching mcdonalds'
a, b, c = pad(sentence.split(), 3)
assert (a, b, c) == ('munching', 'mcdonalds', None)
a, b, c, d = pad(range(3), 4)
assert (a, b, c, d) == (0, 1, 2, None)
a = pad(range(4), 3)
assert a == [0, 1, 2, 3]

更新答案

我做了我的初始帖后想到了这一点,然后myaut也指出了 在评论中说,将其生成为列表可能很危险。如果 我们想把它填充到1E30元素左右?所以这里的功能是 发生器。

def pad(iterable, length=0, padding=None):
    for element in iterable:
        yield element
    for _ in range(length - len(iterable)):
        yield padding

sentence = 'munching mcdonalds'
a, b, c = pad(sentence.split(), 3)
assert (a, b, c) == ('munching', 'mcdonalds', None)
a, b, c, d = pad(range(3), 4)
assert (a, b, c, d) == (0, 1, 2, None)
a = list(pad(range(4), 3))
assert a == [0, 1, 2, 3]

谢谢,myaut!

答案 2 :(得分:0)

嗯......如果你真的想要它:

a, b, c = [value if index >= len(a.split(' ')) else a.split(' ')[index] 
           for index, value in enumerate([None] * 3)]

答案 3 :(得分:0)

在Python 3中,您可以将任意数量的元素分配给元组解包的 last 项。

>>> a, *b = "munching mcdonalds".split()
>>> a
munching
>>> b
['mcdonalds']

答案 4 :(得分:-3)

split()返回一个列表。因此它应该用作一个:

a = "munching mcdonalds"
b = a.split(" ")

>>>b
['munching', 'mcdonalds']
>>>b[0]
'munching' 
>>>b[1]
'mcdonalds'