Python 将字符串转换为数组

Python 将字符串转换为数组,python,python-3.x,Python,Python 3.x,我有一个字符串如下 144.963286 -37.814212 144.964498 -37.813854 144.964962 -37.814806 144.963711, -37.815168 我想将上面的字符串转换为如下数组: [(144.963286, -37.814212), (144.964498, -37.813854), (144.964962, -37.814806), (144.963711, -37.815168)] 使用zip进行切片: s = '144.963286

我有一个字符串如下

144.963286 -37.814212 144.964498 -37.813854 144.964962 -37.814806 144.963711, -37.815168
我想将上面的字符串转换为如下数组:

[(144.963286, -37.814212), (144.964498, -37.813854), (144.964962, -37.814806), (144.963711, -37.815168)]

使用
zip
进行切片:

s = '144.963286 -37.814212 144.964498 -37.813854 144.964962 -37.814806 144.963711 -37.815168'

splitted = s.split()
result = list(zip(splitted[::2], splitted[1::2]))

# [('144.963286', '-37.814212'), ('144.964498', '-37.813854'), ('144.964962', '-37.814806'), ('144.963711', '-37.815168')]

假设您使用点来分隔小数部分和小数部分(不需要逗号),我们可以

  • 删除字符串中的逗号
  • 用空格分隔字符串
  • 将每个子字符串转换为浮点数
  • 成双漂浮
  • 正如@AlexanderReynolds所建议的,我们可以使用而不是
    zip
    来处理具有某种
    fillvalue
    (默认值为
    None
    )的奇数个参数的情况,比如

    我们也可以在一行(相当复杂)中使用类似的

    您可以使用正则表达式:

    import re
    
    s = '144.963286 -37.814212 144.964498 -37.813854 144.964962 -37.814806 144.963711, -37.815168'
    
    pattern = r'(-?\d+\.\d+).+?(-?\d+\.\d+)'
    new_s = [(float(i.group(1)), float(i.group(2))) for i in re.finditer(pattern, s)]
    
    # [(144.963286, -37.814212), (144.964498, -37.813854), (144.964962, -37.814806), (144.963711, -37.815168)]
    

    数组还是列表?它们非常不同。@zwer:Python3
    map
    将返回迭代器,所以应该可以,在Python3.6Ooops上测试,没有注意到标记,我正在将问题标记为一个类似的标记为2.x的问题的副本,这时您的答案弹出。很抱歉。⚘对于浮点数为奇数的字符串,建议使用
    zip\u longest
    。为什么不只使用
    list(zip(拆分[::2],拆分[1::2])
    ?OP需要浮点数而不是字符串要获得浮点数插入字符串,可以将
    splitted=s.split()
    更改为
    splitted=[float(i)for i in s.split()]
    >>> string = '144.963286, -37.814212 42'
    >>> floats = map(float, string.replace(',', '').split())
    >>> from itertools import zip_longest
    >>> list(zip_longest(floats, floats,
                         fillvalue=float('inf')))
    [(144.963286, -37.814212), (42.0, inf)]
    
    >>> from itertools import repeat
    >>> list(zip_longest(*repeat(map(float, string.replace(',', '').split()),
                                 times=2),
                         fillvalue=float('inf')))
    [(144.963286, -37.814212), (42.0, inf)]
    
    import re
    
    s = '144.963286 -37.814212 144.964498 -37.813854 144.964962 -37.814806 144.963711, -37.815168'
    
    pattern = r'(-?\d+\.\d+).+?(-?\d+\.\d+)'
    new_s = [(float(i.group(1)), float(i.group(2))) for i in re.finditer(pattern, s)]
    
    # [(144.963286, -37.814212), (144.964498, -37.813854), (144.964962, -37.814806), (144.963711, -37.815168)]