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
,我应该使用哪些代码?
答案 0 :(得分:8)
如果您实际上需要 b
或c
,您可以执行以下操作:
>>> 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'