LINUX.ORG.RU

Помогите привести во вменяймый вид функцию

 


0

1

На ночь глядя решил написать. Всё работает, но выглядит по уродски. Помогите довести до ума.

def parenthesis(array) :
    '''Make them cry'''
    string = array[0]
    dictionary = []
    start = string.find('{')
    end = string.find('}')
    if start != -1:
        while end > start:
            if string[:start]:
                dictionary.append(string[:start])
            array[0] = string[start+1:]
   #        pdb.set_trace()
            tmp = parenthesis(array)
            string = array[0]
            start = string.find('{')
            end = string.find('}')
            if tmp:
                dictionary.append(tmp)
   #pdb.set_trace()
    if string[:end]:
        dictionary.append(string[:end])
    array[0] = string[end+1:]
    return dictionary

STRING = "{}"
print(parenthesis([STRING]))
STRING = "{lol}"
print(parenthesis([STRING]))
STRING = "{lol{lol}lol}"
print(parenthesis([STRING]))
STRING = "{lol{lol}{lol}lol}"
print(parenthesis([STRING]))

Должен выдавать такое:

[]
[['lol']]
[['lol', ['lol'], 'lol']]
[['lol', ['lol'], ['lol'], 'lol']]

Updated!!!

Перемещено mono из talks



Последнее исправление: cetjs2 (всего исправлений: 4)

Мне не нравится.

pi11 ★★★★★
()

Оно правда работает? А то в одном месте parenthesis, в другом - parentesis.

И таки да, интересно, что оно пытается делать.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 2)
Ответ на: комментарий от tailgunner

Поправил. Да работает. Он тупо повторяет иерархию ковычек списками.

Trieforce
() автор топика

задачку

STRING = "{}"
print(parenthesis([STRING]))
STRING = "{lol}"
print(parenthesis([STRING]))
STRING = "{lol{lol}lol}"
print(parenthesis([STRING]))
STRING = "{lol{lol}{lol}lol}"
print(parenthesis([STRING]))

Должен выдавать такое:

[]
[['lol']]
[['lol', ['lol'], 'lol']]
[['lol', ['lol'], ['lol'], 'lol']]

при условии сбалансированости {} можно сделать простыми регулярками

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

То есть сбалансированности? Инпут будет правильным(как в математике), если ты об этом.

Другое дело что я не знаю как объекты создать. Так я отгрызаю от от стринга всегда с начала, а как по другому я не знаю.

Trieforce
() автор топика
Ответ на: комментарий от Trieforce

То есть сбалансированности?

1) Ввод начинается с {.

2) В середине число { больше чем }

3) В конце число{ = числу }

Вроде нормально так сформулировал

HNO-Arzt_
()
Ответ на: комментарий от MKuznetsov

ожно сделать простыми регулярками

Это как?

Вот с PEG должно быть можно

HNO-Arzt_
()

А вот если бы в питонии итераторы можно было возвращать значения,
Ну или чтоб было что-то такое:
for char in string:
и тут где-нибудь string = string[i:] и дальше итерирование идёт по новому значению string.

Bad_ptr ★★★★★
()
Последнее исправление: Bad_ptr (всего исправлений: 1)
Ответ на: комментарий от Bad_ptr

Ты намекаешь на полностью итеративный метод или на то что я зря морочусь с файндами?

Trieforce
() автор топика
def b2l (s):
    s = s.replace("}{", "'],['")
    s = s.replace("{", "',['")
    s = s.replace("}", "'],'")
    return eval(s[2:-2])

for b in "{}", "{lol}", "{lol{lol}lol}", "{lol{lol}{lol}lol}":
    print(b, "=", b2l(b))
val-amart ★★★★★
()
import re

def boo(str):
    result = []
    stack = [result]
    lastpos = None
    for match in re.finditer(r'[{}]', str):
        br = match.group(0)
        if lastpos and lastpos != match.start():
            stack[-1].append(str[lastpos:match.start()])

        if br == '{':
            cur = []
            stack[-1].append(cur)
            stack.append(cur)
        else:
            stack.pop()

        lastpos = match.end()

    return result


if __name__ == '__main__':
    print boo('')
    print boo('{}')
    print boo('{lol}')
    print boo('{lol{lol}lol}')
    print boo('{lol{lol}{lol}lol}') 
anonymous
()
    def parenthesis(array):
        stack = []
        dictionary = 0
        for s in array[0].split('{'):
            if dictionary!=0:
                stack.append(dictionary)
            dictionary = []
            j = 0
            for s in s.split('}'):
                if j != 0:
                    if not stack:
                        return
                    t = stack.pop()
                    t.append(dictionary)
                    dictionary = t
                j = 1
                if s:
                    dictionary.append(s);
        if stack:
            return
        if dictionary==0:
            return
        return dictionary[0]
anonymous
()
Ответ на: комментарий от Bad_ptr

А вот если бы в питонии итераторы можно было возвращать значения

Use generators, Luke.

tailgunner ★★★★★
()
Ответ на: комментарий от Trieforce

но не безопасно...

Тут уже упоминали про literal_eval

anonymous
()

Написано действительно как говно.

Надо так:

;; OPEN = \{
;; CLOSE = \}
;; WS(ignored) = [\s]*
;; TOKEN = [^\s\{\}]
;; EOF = $
(defun lex (in)
  (prog ((c nil)
         (token (make-array 0 :adjustable t
                              :fill-pointer t
                              :element-type 'character)))
     :start
     (setf c (read-char in nil nil))
     (case c
       ((nil) (return :eof))
       ((#\space #\tab #\return #\newline) (go :start))
       (#\{ (return :open))
       (#\} (return :close))
       (t (vector-push-extend c token)
          (go :token)))
     :token
     (setf c (read-char in nil nil))
     (case c
       ((nil) (return (values :token token)))
       ((#\{ #\} #\space #\tab #\return #\newline)
        (unread-char c in)
        (return (values :token token)))
       (t (vector-push-extend c token)
          (go :token)))))

;; Exprs -> EOF
;;          / Expr Exprs
;; Expr -> TOKEN
;;         / List
;; List -> OPEN ListBody
;; ListBody -> CLOSE
;;             / Expr ListBody
(defun parse (&optional (in *standard-input*))
  (let (token value)
    (labels ((next ()
               (setf (values token value) (lex in)))
             (exprs ()
               (case token
                 (:eof '())
                 (t (cons (expr) (exprs)))))
             (expr ()
               (case token
                 (:token (prog1 value (next)))
                 (t (list-begin))))
             (list-begin ()
               (case token
                 (:open (next) (list-body))
                 (t (error "Unexpected token: ~s" token))))
             (list-body ()
               (case token
                 (:close (next) '())
                 (t (cons (expr) (list-body))))))
      (next)
      (exprs))))

На python сам как-нибудь переведи

lovesan ★★
()
Ответ на: комментарий от lovesan

На python сам как-нибудь переведи

Эту нечитабельную херь бесполезно на что-либо переводить )))))))))))))))))))

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от Trieforce

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

регулярные выражения для этого не предназначены

lovesan ★★
()
Ответ на: комментарий от anonymous

А потом авторы таких костылей из говна и палок вспоминаются с адскими матюками теми, кому приходится разбирать, поддерживать и переписывать рушащуюся пирамиду из соплей, изначально написанную в стиле «ниче, на этот раз и такое сгодидзе»

lovesan ★★
()
20 февраля 2014 г.
Ответ на: комментарий от Xellos

вменяймый

Да откуда же вы лезете, черти страшные!

Лезут из костра, под звуки бубна и дикий танец шомана.

Siado ★★★★★
()
Ответ на: комментарий от lovesan

Ты привел функцию, которая в несколько раз больше функции ТСа

Siado ★★★★★
()
Ответ на: комментарий от Trieforce

Очень хочется, но не безопасно...

чтобы было безопасно можно костыльнуть через json.loads

Siado ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.