Python:先用逗号分割,再用space分割

Python: split line by comma, then by space

我正在使用 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

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

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

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

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

只要输入有效,您的代码就可以正常工作。

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

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

python myscript.py < test.txt

这个怎么样:

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]