【问题标题】:Python: split line by comma, then by spacePython:用逗号分隔行,然后用空格分隔
【发布时间】:2015-05-07 22:49:26
【问题描述】:

我正在使用 Python 3,我需要像这样解析一行

-1 0 1 0 , -1 0 0 1

我想使用Fraction 将其分成两个列表,以便我也可以解析类似的条目

1/2 17/12 , 1 0 1 1

我的程序使用这样的结构

from sys import stdin
...
functions'n'stuff
...
for line in stdin:

我正在尝试做

for line in stdin:
X = [str(elem) for elem in line.split(" , ")]
num = [Fraction(elem) for elem in X[0].split()]
den = [Fraction(elem) for elem in X[1].split()]

但我得到的只是列表索引超出范围错误:den = [Fraction(elem) for elem in X[1].split()] IndexError: list index out of range

我不明白。我从line 得到一个字符串。我在" , " 处将该字符串拆分为两个字符串,并且应该得到一个包含两个字符串的列表X。这些我在空白处拆分为两个单独的列表,同时将每个元素转换为Fraction。我错过了什么?
我还尝试添加X[-1] = X[-1].strip() 以摆脱我从结束行中得到的\n

【问题讨论】:

  • 我想知道同样的事情@PadraicCunningham 看起来如果两种情况都需要考虑,可能需要使用正则表达式
  • 请在执行后续列表推导之前打印出 X 并告诉我们确切的值是什么。另外,你不需要做[str(elem) for elem in line.split(' , ')] 只需做line.split(' , ')
  • [str(elem) for elem in line.split(" , ")] 等价于line.split(" , ")

标签: python string split


【解决方案1】:

问题是您的文件中有一行没有" , ",因此拆分不会返回 2 个元素。

我会改用split(','),然后使用strip 删除前导和尾随空格。注意str(...)是多余的,split已经返回了字符串。

X = [elem.strip() for elem in line.split(",")]

您可能还会在文件末尾有一个空行,这仍然只会为split 产生一个结果,因此您应该有办法处理这种情况。

【讨论】:

    【解决方案2】:

    如果输入有效,您的代码就会真正起作用。

    你可能得到一个无效的行,有太多的空间,甚至是一个空行左右。所以在循环中的第一件事,打印line。然后你就知道发生了什么,你可以在错误消息的正上方看到有问题的行是什么。

    或者你可能没有正确使用标准输入。将输入行写入文件,确保只有有效行(尤其是没有空行)。然后将其输入到您的脚本中:

    python myscript.py < test.txt
    

    【讨论】:

    • 哦。是的。当我使用文件执行此操作时,它可以工作。问题是当我在没有文件的情况下运行时,只是从命令行。然后我得到一个空字符串作为最后一个。
    【解决方案3】:

    这个怎么样:

    pairs = [line.split(",") for line in stdin]
    num = [fraction(elem[0]) for elem in pairs if len(elem) == 2]
    den = [fraction(elem[1]) for elem in pairs if len(elem) == 2]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2018-03-22
      • 1970-01-01
      • 2019-08-19
      • 1970-01-01
      相关资源
      最近更新 更多