Split / Slicing в Python 3 три разных строковых массива - PullRequest
0 голосов
/ 28 января 2019

Код

def clouds_function():
    """
    Extracts Cloud Height and Type from the data 
    Returns: Cloud Height and Type CCCXXX
    """ 
    clouds1 = content[1]
    clouds1 = clouds1[15:len(clouds1)]
    clouds1 = clouds1.split()

    clouds2 = content[2]
    clouds2 = clouds2 + "  "
    clouds2=[clouds2[y-8:y] for y in range(8, len(clouds2)+8,8)]

    clouds3 = content[3]
    clouds3 = clouds3 + "  "
    print(clouds3)
    clouds3=[clouds3[y-8:y] for y in range(8, len(clouds3)+8,8)]

    return(clouds3)

print(clouds_function())

Пример данных

content[1] = 'OVC018  BKN006  OVC006  OVC006  OVC017  OVC005  OVC005 OVC016  OVC029  OVC003  OVC002  OVC001  OVC100'
content[2] ='         OVC025                          OVC010  OVC009                                         OVC200'
content[3] ='         OVC100                                       '

Я пытался

def split(s, n):
    if len(s) < n:
        return []
    else:
        return [s[:n]] + split(s[n:], n)

Возвращает ['OVC100 '] для content[3]

Мне нужно

['','OVC100','','','','','','','','','','','']

Результаты

(['OVC018', 'BKN006', 'OVC006', 'OVC006', 'OVC017', 'OVC005', 'OVC005', 'OVC016', 'OVC029', 'OVC003', 'OVC002', 'OVC001', 'OVC100'], ['OVC025  ', '        ', '        ', '        ', 'OVC010  ', 'OVC009  ', '        ', '        ', '        ', '        ', '     ', 'OVC200  '], ['OVC100  '])

Мне нужны однородные массивы

Возможно, проблема в том, что каждый из них имеет неравномерную длину, чтобы начать с нуля.

1 Ответ

0 голосов
/ 28 января 2019

Ваши данные имеют проблемы с длиной и различными размерами пробелов (2 или 1 символ):

c[1] = 'OVC018  BKN006  OVC006  OVC006  OVC017  OVC005  OVC005 OVC016  OVC029  OVC003  OVC002  OVC001  OVC100'
c[2] ='         OVC025                          OVC010  OVC009                                         OVC200'
c[3] ='         OVC100                                       '
  • c[2] и c[3] используйте 9 символов дляначало 2-го значения, c[1] только 8
  • между 'OVC005 OVC016' - это только 1 пробел, обычно 2
  • c [3] намного короче остальных

Нарезка хороша, если у вас есть постоянная или предсказуемая длина (у вас ее нет) - это можно лучше решить с помощью простого добавления строки и замены пробелов символом, используемым для ее разделения:

  1. сделать все строки одинаковыми по длине - заполнение пробелами
  2. заменить все [8,7,6,2,1] длинных отрезков на '-' - (новый) символ искусственного сплиттера
  3. разделить на '-'

content= ['OVC018  BKN006  OVC006  OVC006  OVC017  OVC005  OVC005 OVC016  OVC029  OVC003  OVC002  OVC001  OVC100',
          '        OVC025                          OVC010  OVC009                                         OVC200',
          '        OVC100                                       ']

# extend data 
max_len = max(len(data) for data in content)

for i,c in enumerate(content):
    # fix legths 
    content[i] = c + " " * (max_len-len(c))
    # replace stretches of spaces by a splitter character
    content[i] = content[i].replace(" "*8,"-").replace(" "*7,"-").replace(" "*6,"-").replace("  ","-").replace(" ","-")


hom = [c.split("-") for c in content]
for c in hom:
    print(c,"\n") 

Выход:

['OVC018', 'BKN006', 'OVC006', 'OVC006', 'OVC017', 'OVC005', 'OVC005', 'OVC016', 'OVC029', 'OVC003', 'OVC002', 'OVC001', 'OVC100']

['', 'OVC025', '', '', '', 'OVC010', 'OVC009', '', '', '', '', '', 'OVC200']

['', 'OVC100', '', '', '', '', '', '', '', '', '', '', '']
...