Уведомления

Группа в Telegram: @pythonsu

#1 Июль 18, 2014 14:37:42

Seganapa
От: Новороссийск
Зарегистрирован: 2012-07-31
Сообщения: 139
Репутация: +  0  -
Профиль   Отправить e-mail  

Как разбить строку?

str = "Запчасти кузова | -Детали кузова / крыло / буфер | --Продольная / поперечная балка | --Колесная ниша | --Накладки порога / двери | ---Боковина | --Крыло / навесные части | --Обшивка кузова | -Крышки багажника / капоты / двери / складная крыша |
"

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

Запчасти кузова | -Детали кузова / крыло / буфер | –Продольная / поперечная балка |
Запчасти кузова | -Детали кузова / крыло / буфер | –Колесная ниша |
Запчасти кузова | -Детали кузова / крыло / буфер | –Накладки порога / двери | —Боковина |
Запчасти кузова | -Детали кузова / крыло / буфер | –Крыло / навесные части |
Запчасти кузова | -Детали кузова / крыло / буфер | –Обшивка кузова |
Запчасти кузова | -Крышки багажника / капоты / двери / складная крыша |

Понимаю что для начало нужно разбить строку split, а дальше что?



—————————————————————–
Изучаю и параллельно использую Python 2.7

Отредактировано Seganapa (Июль 18, 2014 14:39:26)

Офлайн

#2 Июль 18, 2014 17:11:24

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как разбить строку?

Откуда такой формат данных берётся?



Офлайн

#3 Июль 18, 2014 23:01:42

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Как разбить строку?

как-то так

# -*- coding: utf-8 -*-
def f(s):
    a = s[:-1].split('|')
    for i in xrange(0, len(a)*2, 2):
        a.insert(i+1, 0)
        for j in a[i][1:]:
            if j == '-':
	        a[i+1] += 1
	    else:
	        break
    s_out = ""
    if len(a) < 4:
        return s
    for i in xrange(3, len(a), 2):
        if a[i] <= a[i-2]:
	    index = a[i]-1
	    s_tmp = a[i-1]
	    for j in xrange(i-2, 0, -2):
		if a[j] == index:
	            s_tmp = a[j-1] + s_tmp
		    index -= 1
	    s_out += s_tmp + "\n"
    return s_out
s_in = r"Запчасти кузова | -Детали кузова / крыло / буфер | --Продольная / поперечная балка | --Колесная ниша | --Накладки порога / двери | ---Боковина | --Крыло / навесные части | --Обшивка кузова | -Крышки багажника / капоты / двери / складная крыша |"
print f(s_in)
Запчасти кузова  -Детали кузова / крыло / буфер  --Колесная ниша 
Запчасти кузова  -Детали кузова / крыло / буфер  --Накладки порога / двери 
Запчасти кузова  -Детали кузова / крыло / буфер  --Крыло / навесные части 
Запчасти кузова  -Детали кузова / крыло / буфер  --Обшивка кузова 
Запчасти кузова  -Крышки багажника / капоты / двери / складная крыша 



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Июль 18, 2014 23:04:51)

Офлайн

#4 Июль 18, 2014 23:22:01

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Как разбить строку?

s = s.strip(' |').split(' | ')
def print_line(result):
    print(' | '.join(result[k] for k in sorted(result)) + ' |')
result = {}
for elem in s:
    number_dash = elem.count('-')
    if number_dash in result:
        print_line(result)
        result[number_dash] = elem
        if number_dash + 1 in result:
            del result[number_dash + 1]
    else:
        result[number_dash] = elem
else:
    print_line(result)



Офлайн

#5 Июль 19, 2014 00:53:49

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Как разбить строку?

Budulianin

s = r"Запчасти кузова - комплектующие | -Детали кузова / крыло / буфер | --Продольная / поперечная балка | --Колесная ниша | --Накладки порога / двери | ---Боковина | --Крыло / навесные части | --Обшивка кузова | -Крышки багажника / капоты / двери / складная крыша |"
Запчасти кузова - комплектующие |
-Детали кузова / крыло / буфер | --Продольная / поперечная балка |
-Детали кузова / крыло / буфер | --Колесная ниша |
-Детали кузова / крыло / буфер | --Накладки порога / двери | ---Боковина |
-Детали кузова / крыло / буфер | --Крыло / навесные части |
-Детали кузова / крыло / буфер | --Обшивка кузова |
-Крышки багажника / капоты / двери / складная крыша |
или
s = r"Запчасти кузова | -Детали кузова / крыло / буфер | --Продольно-поперечная балка | --Колесная ниша | --Накладки порога / двери | ---Боковина | --Крыло / навесные части | --Обшивка кузова | -Крышки багажника / капоты / двери / складная крыша |"
Запчасти кузова | -Детали кузова / крыло / буфер | --Колесная ниша | --Продольно-поперечная балка |
Запчасти кузова | -Детали кузова / крыло / буфер | --Накладки порога / двери | ---Боковина |
Запчасти кузова | -Детали кузова / крыло / буфер | --Крыло / навесные части |
Запчасти кузова | -Детали кузова / крыло / буфер | --Обшивка кузова |
Запчасти кузова | -Крышки багажника / капоты / двери / складная крыша |



————————————————
-*- Simple is better than complex -*-

Офлайн

#6 Июль 19, 2014 01:32:28

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

Как разбить строку?

terabayt
Хе, ну принимай патч тогда.

def print_line(result):
    print(' | '.join(result[k] for k in sorted(result)) + ' |')
result = {}
for elem in s:
    match = re.match('(-+)[а-яА-Я0-9]+', elem)
    number_dash = match and len(match.group(1)) or 0
    if number_dash in result:
        print_line(result)
        result[number_dash] = elem
        if number_dash + 1 in result:
            del result[number_dash + 1]
    else:
        result[number_dash] = elem
else:
    print_line(result)



Офлайн

#7 Июль 21, 2014 14:05:35

Seganapa
От: Новороссийск
Зарегистрирован: 2012-07-31
Сообщения: 139
Репутация: +  0  -
Профиль   Отправить e-mail  

Как разбить строку?

terabayt
Второй вариант

Ваш код работает, но почему-то теряются некоторые элементы
Например из такой строки

s_in = r"Запчасти кузова | -Детали кузова / крыло / буфер | --Продольная / поперечная балка | --Колесная ниша | --Накладки порога / двери | --Боковина | --Крыло / навесные части | --Обшивка кузова | -Крышки багажника / капоты / двери / складная крыша | --Двери / составляющие | -Дополнительная фара / комплектующие | --Противотуманная фара / комплектующие | ---Противотуманная фара лампа накаливания | --Фара дальнего света / комплектующие | ---Лампа накаливания фара дальнего света | -Система освещения / световые приборы | --Габаритный огонь / комплектующие | ---Лампа накаливания | --Фонарь стоп-сигнала / комплектующие | ---Лампа накаливания | --Фонарь указателя поворота / комплектующие | ---Лампа накаливания | --Фонарь освещения номерного знака / комплектующие | ---Лампа накаливания | --Задняя противотуманная фара / комплектующие | ---Лампа накаливания | --Фара заднего хода / комплектующие | ---Лампа накаливания | --Фонарь, установленный в двери | -Основная фара / комплектующие | --Лампа накаливания основной фары | -Запчасти передней части кузова | --Основная фара / комплектующие | ---Лампа накаливания основной фары | --Противотуманная фара / комплектующие | ---Противотуманная фара лампа накаливания | --Фара дальнего света / комплектующие | ---Лампа накаливания фара дальнего света | --Фонарь указателя поворота / комплектующие | ---Лампа накаливания | --Детали крепления | ---Упругие элементы | --Колесная ниша | -Кабина пассажира | --Накладки порога / двери | --Двери / составляющие | --Боковина | --Топливный бак | -Запчасти задней части кузова | --Габаритный огонь / комплектующие | ---Лампа накаливания | --Фонарь стоп-сигнала / комплектующие | ---Лампа накаливания | --Фонарь указателя поворота / комплектующие | ---Лампа накаливания | --Фонарь освещения номерного знака / комплектующие | ---Лампа накаливания | --Задняя противотуманная фара / комплектующие | ---Лампа накаливания | --Фара заднего хода / комплектующие | ---Лампа накаливания | --Облицовка | --Колесная ниша | --Топливный бак | --Крыло / навесные части | --Боковина | --Задняя дверь / детали | -Топливный бак | -Упругие элементы"

Пропадает "–Продольная / поперечная балка"



—————————————————————–
Изучаю и параллельно использую Python 2.7

Отредактировано Seganapa (Июль 21, 2014 14:06:10)

Офлайн

#8 Июль 21, 2014 14:48:05

Seganapa
От: Новороссийск
Зарегистрирован: 2012-07-31
Сообщения: 139
Репутация: +  0  -
Профиль   Отправить e-mail  

Как разбить строку?

Проблема остается актуальной!

Может я изначально что-то не так делаю. (как раз к вопросу

Откуда такой формат данных берётся?
)

Предыстория ))

Имеется множество похожих списков (с иерархией)

СПИСОК 1:
Запчасти кузова
  -Детали кузова перед / крыло / буфер
    --Продольная / поперечная балка
    --Колесная ниша
    --Накладки порога / двери
  -Крышки багажника / капоты / двери / складная крыша
    --Двери / составляющие
      ---Ручка двери
Запчасти двигателя
  -Газораспределительный механизм
    --Ремень ГРМ / натяжение ремня
      ---Ремень ГРМ
      ---Комплект ремней ГРМ
    --Цепь привода распредвала / натяжение
      ---Планка успокоителя


СПИСОК 2:
Запчасти кузова
  -Детали кузова перед / крыло / буфер
    --Колесная ниша
  -Детали кузова зад / крыло / буфер
    --Колесная ниша
  -Крышки багажника / капоты / двери / складная крыша
    --Двери / составляющие
      ---Стекло двери
    --Крыша / составляющие
      ---Стекло двери
Запчасти двигателя
-Газораспределительный механизм
–Ремень ГРМ / натяжение ремня
—Ремень ГРМ
—Комплект ремней ГРМ
–Цепь привода распредвала / натяжение
—Планка успокоителя

И т.д.
Списков очень много, они похожи НО уровень вложенности и некоторые пункты могут отличатся.
На выходе мне нужно получить один ОБЩИЙ список всех пунктов, и при этом соблюсти вложенность.

на выходе должно получится:
Запчасти кузова
  -Детали кузова / крыло / буфер
    --Продольная / поперечная балка
    --Колесная ниша
    --Накладки порога / двери
  -Детали кузова зад / крыло / буфер
    --Колесная ниша
  -Крышки багажника / капоты / двери / складная крыша
    --Двери / составляющие
      ---Ручка двери
      ---Стекло двери
    --Крыша / составляющие
      ---Стекло двери
Запчасти двигателя
  -Газораспределительный механизм
    --Ремень ГРМ / натяжение ремня
      ---Ремень ГРМ
      ---Комплект ремней ГРМ
    --Цепь привода распредвала / натяжение
      ---Планка успокоителя

Посоветуйте правильный алгоритм, пожалуйста. К какому виду может привести эти списки, чтобы было удобнее с ними работать и исключить ошибки…



—————————————————————–
Изучаю и параллельно использую Python 2.7

Отредактировано Seganapa (Июль 21, 2014 15:42:24)

Офлайн

#9 Июль 21, 2014 15:15:13

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Как разбить строку?

1) Оформи их в теги кода, чтобы дефисы не сливались.
2) Приведи входные списки и выходной список.



Офлайн

#10 Июль 21, 2014 15:45:09

Seganapa
От: Новороссийск
Зарегистрирован: 2012-07-31
Сообщения: 139
Репутация: +  0  -
Профиль   Отправить e-mail  

Как разбить строку?

py.user.next
1) Оформи их в теги кода, чтобы дефисы не сливались.2) Приведи входные списки и выходной список.
поправил.
Не знаю если поможет, в общем мне нужно спарсить множество списков (ul li) и объединить их в один, сохранив при этом иерархию и все пункты… Как-то так.



—————————————————————–
Изучаю и параллельно использую Python 2.7

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version