我有一个以下形式的字符串:
s = "1,2;3,4"
我必须获得:
res = [(1,2),(3,4)]
我想不出比以下更好的了:
pairs = [pair.split(",") for pair in s.split(";")]
res = [(int(a), int(b)) for a,b in pairs]
事实上这不起作用:
>>> res = [(int(a),int(b)) for pair in s.split(";") for a,b in pair.split(",")]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <listcomp>
ValueError: not enough values to unpack (expected 2, got 1)
我的问题是:
- 有单行解决方案吗?实现这一目标最Pythonic的方法是什么?
- 为什么我的后一个代码不起作用?
最佳答案
试试这个:
>>> [tuple(int(x) for x in i.split(',')) for i in s.split(';')]
[(1, 2), (3, 4)]
或者拆包:
>>> [(*(int(x) for x in i.split(',')),) for i in s.split(';')]
[(1, 2), (3, 4)]
>>>
或者:
>>> [tuple(map(int, i.split(','))) for i in s.split(';')]
[(1, 2), (3, 4)]
您可以尝试使用 tuple(map(...))
进行列表理解或嵌套列表理解。
您的代码不起作用的原因是您在通过两个迭代器解压列表时尝试迭代包含两个项目的列表。为此不需要迭代。要修复您的代码,请尝试:
res = [(int(pair.split(',')[0]), int(pair.split(',')[1])) for pair in s.split(";")]
print(res)
输出:
[(1, 2), (3, 4)]
或者:
[(int(a), int(b)) for a, b in [pair.split(",") for pair in s.split(";")]]
关于python - 字符串上的多个分割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69141258/