#python #python-3.x #string #list
#питон #python-3.x #строка #Список
Вопрос:
Я новичок в программировании и пытаюсь преобразовать входную строку из букв и квадратных скобок (т. Е. [ и ]) в список букв и списков. Квадратные скобки указывают, где начинается и заканчивается список, в то время как каждая буква переводится в элемент соответствующего списка.
str2list(‘[abc]’)
должен вернуться [‘a’,‘b’,‘c’]
str2list(‘[a[bc]]’)
должен вернуться [‘a’,[‘b’,‘c’]]
Мои попытки в этом:
Попытка 1:
def str2list(s): list1=[] list1[:0]=s # s.replace(',', '') # a = s.split(",") list1.append([]) return list1 str2list('[abc]')
Попытка 2:
def str2list(s): list1=[] list1[:0]=s return list1 str2list('[abc]')
Но я не получаю желаемого результата. Я застрял. Не мог бы кто-нибудь, пожалуйста, помочь мне и сказать, что нужно сделать?
Ответ №1:
def s2l(i): while True: n = next(i) if n == '[': yield [x for x in s2l(i) ] elif n == ']': return else: yield n res = next(s2l(iter("[ab[123]cd]")))
печать(res) вернется
['a', 'b', ['1', '2', '3'], 'c', 'd']
Комментарии:
1. вау, рекурсия в понимании в генераторе в цикле в цикле 🙂
2. Спасибо за помощь, я попробовал ваш код, но он показывает ошибку или странный вывод типа «lt;объект генератора s2l в 0x7fab086d65f0gt;». Не могли бы вы, пожалуйста, помочь?
3. обновлено для py3
Ответ №2:
Вам просто нужно тщательно подумать о том, если-еще-условия:
def str2list(my_str): out = [] for s in my_str.split('['): if ']' in s[:-1]: s1 = s.split(']') s1 = [list(s1[0])] list(s1[1]) elif s[-1:] == ']': s1 = [list(s.strip(']'))] else: s1 = list(s) out.extend(s1) return out print(str2list('[wewr[sfs]]')) print(str2list('[wewr[sfs]da]')) print(str2list('[wewr[sfs]da[ds]]')) print(str2list('[wewr[sfs]da[ds][dfd]]'))
Выход:
['w', 'e', 'w', 'r', ['s', 'f', 's']] ['w', 'e', 'w', 'r', ['s', 'f', 's'], 'd', 'a'] ['w', 'e', 'w', 'r', ['s', 'f', 's'], 'd', 'a', ['d', 's']] ['w', 'e', 'w', 'r', ['s', 'f', 's'], 'd', 'a', ['d', 's'], ['d', 'f', 'd']]
Комментарии:
1. О чем
str2list("[ab[cd[efg]]]")
?