繁体   English   中英

将字符串转换为2元组列表

[英]Converting a string to a list of 2-tuples

我有这种形状的字符串:

d="M 997.14282,452.3622 877.54125,539.83678 757.38907,453.12006 802.7325,312.0516 950.90847,311.58322 Z"

它们是五边形的(x, y)坐标(第一个和最后一个字母是元数据并且被忽略)。 我想要的是一个2元组的列表,它代表浮点中的坐标而没有所有的东西:

d = [(997.14282, 452.3622), (877.54125, 539.83678), (757.38907, 453.12006), (802.7325,312.0516), (950.90847, 311.58322)]

修剪字符串很简单:

>>> d.split()[1:-2]
['997.14282,452.3622', '877.54125,539.83678', '757.38907,453.12006', '802.7325,312.0516']

但现在我想以简洁的方式创建元组。 这显然不起作用:

>>> tuple('997.14282,452.3622')
('9', '9', '7', '.', '1', '4', '2', '8', '2', ',', '4', '5', '2', '.', '3', '6', '2', '2')

拿原始字符串,我可以这样写:

def coordinates(d):
    list_of_coordinates = []
    d = d.split()[1:-2]
    for elem in d:
        l = elem.split(',')
        list_of_coordinates.append((float(l[0]), float(l[1])))
    return list_of_coordinates

哪个工作正常:

>>> coordinates("M 997.14282,452.3622 877.54125,539.83678 757.38907,453.12006 802.7325,312.0516 950.90847,311.58322 Z")
[(997.14282, 452.3622), (877.54125, 539.83678), (757.38907, 453.12006), (802.7325, 312.0516)]

然而,这个处理是一个更大的程序的一个小而微不足道的部分,我宁愿保持尽可能短和简洁。 任何人都可以告诉我一个不那么冗长的方法将字符串转换为2元组列表?

您可以使用列表推导在一行中执行此操作。

x = [tuple(float(j) for j in i.split(",")) for i in d.split()[1:-2]]

这通过d.split()[1:-2]] ,每对应该组合在一起,用逗号d.split()[1:-2]]它们,将其中的每个项目转换为浮点数,并将它们组合在一个元组中。

此外,您可能希望使用d.split()[1:-1]因为使用-2删除最后一对坐标。

注意,不确定这是否是预期的 - 当你执行d.split()[1:-2] ,你正在丢失最后一个坐标。 假设这不是故意的,那么一个班轮就是 -

def coordinates1(d):
    return [tuple(map(float,coords.split(','))) for coords in d.split()[1:-1]]

如果故意丢失最后一个坐标,请在上面的代码中使用[1:-2]

虽然你做得很好,但它可能是使用列表理解或一些功能性东西压缩的(我的意思是“地图”):

    def coordinates(d):
        d = d[2:-2].split() # yeah, split here into pairs
        d = map(str.split, d, ","*len(d)) # another split, into tokens
        # here we'd multiplied string to get right size iterable
        return list(map(tuple, d)) # and last map with creating list
        # from "map object"

当然,它可以通过列表理解简化为一行,但是也可以减少可读性(而现在的代码很难阅读)。 虽然Guido讨厌功能编程,但我发现这更合乎逻辑......经过一些练习。 祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM