Нужно найти пропущенные значения из строки на основе логики сглаживания - PullRequest
0 голосов
/ 11 июля 2019

Мне дали строку с цифрами и символами '' (пропущенное значение), и я должен заменить символы '', как объяснено:

Input1: "_,_,_,24"
Output1: 6,6,6,6
Input2: "40,_,_,_,60"
Output2: 20,20,20,20,20
Input4: "_,_,30,_,_,_,50,_,_"
Output4: 10,10,12,12,12,12,4,4,4

Я пытался использовать базовые циклы for и, если затем, использовать 2 точки разворота, но все эти подходы ставятся под сомнение при изменении входной строки. Я нахожу это немного сложным для разработки общей системы. Я не уверен, есть ли какие-либо конкретные библиотеки в Python, с которыми я могу это сделать или нет. Предложения в любой форме псевдокода приветствуется.

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

Можно улучшить наверняка, но это делает трюк:

string = "_,_,30,_,_,_,50,_,_"
output = string.split(',')

pos = 0
next_value = 0
last_pos = 0
last_value = 0

while pos < len(output):
    if output[pos] != '_' or (pos + 1 == len(output)):
        if output[pos] != '_':
            next_value = int(output[pos])
        else:
            next_value = 0
        new_value = (next_value + last_value) / (pos - last_pos + 1)
        for i in range(last_pos, pos + 1):
            output[i] = new_value
        last_value = new_value
        last_pos = pos
    pos += 1

print(output)

Это создает массив с плавающей точкой: [10.0, 10.0, 12.0, 12.0, 12.0, 12.0, 4.0, 4.0, 4.0]

Дополнительная информация:

  • Вы должны найти не пропущенное значение, выполнив итерацию в массиве.
  • Когда вы нашли его, вы добавляете его к последнему найденному непропущенному значению (0 в противном случае) и и установитесреднее значение для всех ячеек между вехами (включая самих себя)
  • Когда вы достигнете конца массива, не забудьте сделать то же самое.Текущее значение становится 0, вы добавляете его к предыдущему и делитесь им снова

Если мы возьмем следующую строку _,_,30,_,_,_,50,_,_

Сначала мы найдем 30. Мы делим это междуначало и текущая позиция.

Мы получили: 10,10,10,_,_,_,50,_,_

Затем мы находим 50. Предыдущее числовое значение равно 10. Таким образом, мы делим 60 между положением 10 и 50 (чтоэто 5 ячеек)

Мы получили: 10,10,12,12,12,12,12,_,_

Мы достигли конца массива.

0 + 12 = 12 -> Мы делим его между текущим положениеми последние 12 поз (что составляет 3 ячейки)

Мы получили 10,10,12,12,12,12,4,4,4

0 голосов
/ 11 июля 2019

Попробуйте этот код:

output = '10,,35,,,67,400'
output = output.split(',')
new_output = []

for i in output:
    if i != '':
        new_output.append(i)
...