将列表组合成元组对(x,y)

2024-10-05 11:35:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试组合通过sys.argv传入的成对数字。 示例:

python myscript.py -35.12323 112.76767 -36.33345 112.76890 -33.68689 111.8980

我的目标是把它们变成两个一组的元组。 像这样:

((-35.12323,112.76767),(-36.33345,112.76890),(-33.68689,111.8980))

这是我到目前为止尝试过的,但是当我将结果传递给Shapely Point和Polygon方法时会出现问题。

from shapely.geometry import Polygon
from shapely.geometry import Point
import sys

def args_to_tuple(list):
    arglist = []

    for coord in list:
        arglist.append(float(coord))

    i = 0
    polylist = []

    for xory in arglist:
        tmp = (arglist[i],arglist[i+1])
        polylist.append(tmp)

    return tuple(polylist)


poly = Polygon(args_to_tuple(sys.argv[3:]))

# xy pair for point is first two sys args
point = Point(args_to_tuple(sys.argv[1:3]))

print point.within(poly) # should result in true, but doesn't
print poly.contains(point) # should result in true, but doesn't

看起来这在itertools中是很常见的,但是我在那个模块中似乎找不到任何东西可以让您一对抓住项目。


Tags: toinfromimportforsysargspoint
3条回答

我猜点构造函数可能会取1对,而不是包含1对的元组?为此,您需要更改:

point = Point(args_to_tuple(sys.argv[1:3]))

致:

point = Point(args_to_tuple(sys.argv[1:3])[0])

或者可能:

point = Point(*args_to_tuple(sys.argv[1:3])[0])

如果不知道shapely的API,我就不确定了。

至于将参数转换为成对元组,您的方法做得很好。但是,如果您想要一个预打包的无麻烦解决方案,我将查看pytoolz的partition_all方法,用于将对分组在一起。同样看看cytoolz,它努力使这些方法在性能上与C相媲美。

编辑

我注意到你的方法有缺陷。你没有在你的循环中从args_到tuple方法递增i!下面是一个修订版本,您可以在其中填充多段列表:

polylist = [(arglist[i],arglist[i+1]) for i in xrange(0,len(arglist),2)]
In [10]: args_str = '-35.12323 112.76767 -36.33345 112.76890 -33.68689 111.8980'

In [11]: args = map(float, args_str.split())

In [12]: args
Out[12]: [-35.12323, 112.76767, -36.33345, 112.7689, -33.68689, 111.898]

In [13]: zip(args[::2], args[1::2])
Out[13]: [(-35.12323, 112.76767), (-36.33345, 112.7689), (-33.68689, 111.898)]

zip可以替换为产生迭代器而不是列表的^{}

def args_to_tuple(lst):
    it = iter(map(float, lst.split()))
    return [(item, next(it)) for item in it]

>>> a = '-35.12323 112.76767 -36.33345 112.76890 -33.68689 111.8980'
>>> args_to_tuple(a)
[(-35.12323, 112.76767), (-36.33345, 112.7689), (-33.68689, 111.898)]

相关问题 更多 >

    热门问题