转换列表

时间:2016-11-09 12:43:20

标签: python list indexing split satellite

输入:

 lst=[ '  22774080.570 7                   1762178.392 7   1346501.808 8  22774088.434 8\n',
     '  20194290.688 8                  -2867460.044 8  -2213132.457 9  20194298.629 9\n']

所需的输出:

['22774080.570 7','none','1762178.392 7','1346501.808 8','22774088.434 8'],
['20194290.688 8','none','-2867460.044 8', .... ]

2 个答案:

答案 0 :(得分:0)

我不会马上回答你的问题,因为它不是stackoverflow的工作方式,但我会给你一些提示。

<强> HINTS

  • 首先,您可以使用for loop迭代第一个列表lst的每一行。

  • 然后,您需要拆分此行的每个数字,幸运的是,它总是需要16个字符。 在python中,有几种方法可以这样做。对您进行的良好培训是在for循环中使用range function。然后在python字符串中使用slicing

  • 现在,它可能会在每个数字的开头留下一些额外的空格。删除它们的好方法是使用strip() function

  • 您需要做的最后一件事是append每个清理字符串到一个新列表(例如result

<强> END

只要您正确地尝试编辑您的答案,我就会使用工作函数编辑我的答案。祝你好运!

编辑

由于我的同名@Max Chesterfield已经给出答案,我会给我的。您可以使用generator来精确匹配所需的输出

,而不是使用列表列表
def extract_line():
    for line in lst:
        result = []
        for i in range(0, len(line) - 1, 16):
            numbers = line[i:i + 16].strip()
            result.append(numbers if numbers else None)
        yield result

for result in extract_line():
    print(result)

将输出:

['22774080.570 7', None, '1762178.392 7', '1346501.808 8', '22774088.434 8']
['20194290.688 8', None, '-2867460.044 8', '-2213132.457 9', '20194298.629 9']

答案 1 :(得分:0)

我在这里做了一些假设,这可能不是最优雅的解决方案,但鉴于您根据空间长度匹配无,这将有效

[[(None if a.strip() == 'None' else a.strip()) 
    for a in l.replace('                  ', '  None  ').split('  ')  if a != ''
    ] for l in lst]

目前这是作为列表理解实现的,但为了便于阅读,可以很容易地分布在多行上

new_list = []
for l in lst:
    sub_list = []
    for a in l.replace('                  ', '  None  ').split('  '):
        if a != '':
            item = a.strip()
            sub_list.append(None if item == 'None' else item)
    new_list.append(sub_list)

任何一种方法都会产生相同的结果:

[
 [
  '22774080.570 7', None, '1762178.392 7', '1346501.808 8', '22774088.434 8'
 ], 
 [
  '20194290.688 8', None, '-2867460.044 8', '-2213132.457 9', '20194298.629 9'
 ]
]

请记住,用于定义“无”的空格宽度的任何变化都是“无”。将影响这种实施的功能。