从Python中的一系列有序对中提取整数?

时间:2013-07-02 01:36:10

标签: python tuples sequence split iterable-unpacking

这对你们很多人来说可能非常简单,但我似乎无法找到它。我有一个想法,但我觉得我做得比我应该做的更多。我正在尝试以(x1,x2)(y1,y2)格式从文件中读取数据。我的目标是使用值x1,x2,y1和y2编码距离计算。

问题:如何从此字符串中提取整数?

3 个答案:

答案 0 :(得分:3)

它被称为sequence unpacking,可以像这样完成

>>> a =(1,2)
>>> x1,x2=a
>>> x1
1
>>> x2
2
>>> b = [[1,2],[2,3]]
>>> (x1,x2),(y1,y2)=b
>>> x1
1
>>> x2
2
>>> y1
2
>>> y2
3
>>>

答案 1 :(得分:3)

使用正则表达式

>>> import re
>>> s = "(5, 42) (20, -32)"
>>> x1, y1, x2, y2 = map(int, re.match(r"\((.*), (.*)\) \((.*), (.*)\)", s).groups())
>>> x1, y1
(5, 42)
>>> x2, y2
(20, -32)

或没有正则表达式

>>> x1, y1, x2, y2 = (int(x.strip("(),")) for x in s.split())

答案 2 :(得分:0)

如果您试图从某些列表和变量中获取值,这是一种方法。

>>> x1, y1, x2, y2 = [1, 2] + [3, 4]
>>> x1
1
>>> x2
3
>>> y1
2
>>> y2
4
>>> 

元组将表现出相同的行为。

x1, y1, x2, y2 = (1, 2) + (3, 4)

以下是如何读取文件中的输入并使用gnibbler的正则表达式解析它

import re

with open("myfile.txt", 'r') as file_handle:

    for line in file_handle:
        x1, y1, x2, y2 = map(int, re.match(r"\((.*), (.*)\) \((.*), (.*)\)", line).groups())
        print x1, y1, x2, y2