尝试迭代字符串中的字符时Python的行为

时间:2017-04-09 15:12:32

标签: python string python-3.x for-loop iteration

我正在尝试使用<input>循环迭代以下字符串:

input[id^=tab]:checked ~ .col-xs-12 [data-affectedby=this.id]

现在我打算做的就是在一个物理线上单独打印字符串中的每个字符,而不是收到错误。我知道通过将字符串包含在列表运算符for

可以很容易地解决这个问题
>>> for a,b,c in "cat"
        print(a,b,c)

但有人可以解释为什么会这样吗?

3 个答案:

答案 0 :(得分:6)

您告诉for扩展每个迭代值以分配给三个单独的变量:

for a,b,c in "cat":
#   ^^^^^ the target for the loop variable, 3 different names

但是,对字符串的迭代会产生一个包含单个字符的字符串,您不能将单个字符分配给三个变量:

>>> loopiterable = 'cat'
>>> loopiterable[0]  # first element
'c'
>>> a, b, c = loopiterable[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 3, got 1)

错误消息告诉您为什么这不起作用;你不能从长度为1的字符串中取三个值。

当您将字符串放入列表时,您更改了循环的内容。您现在有一个包含一个元素的列表,因此循环只迭代一次,单次迭代的值是字符串'cat'。该字符串发生有3个字符,因此可以分配给三个变量:

>>> loopiterable = ['cat']
>>> loopiterable[0]  # first element
'cat'
>>> a, b, c = loopiterable[0]
>>> a
'c'
>>> b
'a'
>>> c
't'

如果包含的字符串具有不同的字符数,则仍然会失败:

>>> for a, b, c in ['cat', 'hamster']:
...     print(a, b, c)
...
c a t
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 3)

'hamster'是7个字符,而不是3个字符;这太多了。

正确的解决方案是只为循环目标使用一个变量,而不是3:

for character in 'cat':
    print(character)

现在分别打印每个角色:

>>> for character in 'cat':
...     print(character)
...
c
a
t

现在,如果您想将字符串的所有字符作为单独的参数传递给print(),只需使用*扩展字符串以分隔调用的参数:

>>> my_pet = 'cat'
>>> print(*my_pet)
c a t

答案 1 :(得分:3)

for循环遍历您提供的可迭代中的每个元素,并尝试执行赋值。

在第一种情况下,由于您的可迭代版本为'cat',因此您实际上已解压缩:

a, b, c = 'c'
第一次迭代期间

并获取相应的错误消息:

ValueError: not enough values to unpack (expected 3, got 1)

因为您将迭代 3次;一旦为字符串中的每个字符 'cat'

在第二种情况下,您按预期解压缩"cat",因为列表有一个元素(即'cat'),它会被检索并解压缩到a, bc

答案 2 :(得分:2)

您正在两个代码块中迭代不同的对象。 在前一个中,您迭代字符串,可以将其视为special list

在后者中,你迭代只包含一个对象的list&#39; cat&#39;。

您可以将第一个更改为:

for ch in 'cat':
    print(ch)

随意提出更多相关信息。