【问题标题】:Python string.split more than one value in for loopPython string.split for 循环中的多个值
【发布时间】:2011-02-18 16:59:57
【问题描述】:

基本上这工作正常:

>>> 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

我想知道有什么区别,以及如何解决这个 for 循环。

【问题讨论】:

    标签: python string split


    【解决方案1】:

    在“=”上拆分为您提供两个值:

    "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("=")
        ...
    

    【讨论】:

    • 是的,这正是我打算做的,谢谢你的回答。
    • 不将列表理解塞进循环头是个好主意。将元组解包移动到循环中并引入虚假变量 pair 不是 - 只需使用 for x, y in pair_list(理想情况下,xy 也会获得更有意义的名称......)。
    • @delnan,pair_list 看起来像 ["foo=bar", "blah=boo", "etc=something"],它不是元组列表,而是字符串列表。可能有更快的方法来处理整个字符串,但我认为这将是一个过早的优化。我错过了什么吗?
    • 不,我不知何故认为这对已经分开了(好吧,我会建议pair_list = [raw_pair.split('=') for raw_pair in params.split(',')])。
    • @delnan,没问题。顺便说一句,这实际上是我给出的第一个示例,但没有分配给变量。
    【解决方案2】:

    你可以的

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

    您尝试的是迭代序列["x", "y"],但为序列的每个条目分配x, y。这相当于

     x, y = "x"
    

    对于第一次迭代,这没有任何意义。

    【讨论】:

    • 嗯.. 但我想分配给“x”。有什么方法可以做到这一点而无需在 for 循环中说 x = x[0] 的额外步骤?
    • @user: 使用 for x in ..., x is 列表中的第一项 split 返回(在第一次迭代中,第二次是第二项,即"y")。
    【解决方案3】:

    我不确定您为什么要这样做,但如果出于某种原因您想为此使用 for 循环:

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

    【讨论】:

      【解决方案4】:

      因为 split 函数返回一个列表。在 for 循环的上下文中,它一次获取一个项目。例如:'k=y'.split('=') 返回一个包含['k', 'y'] 的列表。因为它在for循环中,所以你得到'k',然后是'y'。

      它在 for 循环之外工作的原因是它一次看到整个列表,而不是在 for 循环中一次看到一个项目,并且能够解包它。

      要修复它,您可以将数据拆分为 for 循环之外的元组列表,然后循环遍历。例如:[('x', 'y'), ...]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-08-18
        • 1970-01-01
        • 2019-08-04
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 2012-12-12
        相关资源
        最近更新 更多