有没有办法轻松地将 2 个索引之间的所有元素放入 Python 中的嵌套列表中?
Is there a way to easily put all elements between 2 indexes into a nestled list in Python?
我有一个列表 l
l = ['a','a','{','b','a','{','a','}','}','a']
我想把这个列表变成下面的列表。
print(new_l)
# ['a','a',['{','b','a',['{','a','}'],'}'],'a']
所以,基本上,花括号内的所有内容,包括大括号本身,都应该位于原始列表内的列表内。
编辑:谢谢大家的精彩回答。现在,我希望嵌套列表也包含“{”之前的元素吗?我知道我应该一开始就提到这一点,但忘记了这个要求。
print(new_l)
# ['a',['a','{','b',['a','{','a','}'],'}'],'a']
查看 pyparsing
。
from pyparsing import nestedExpr
l = ['a','a','{','b','a','{','a','}','}','a']
l.insert(0, "{")
l.insert(len(l), "}")
print(nestedExpr('{','}').parseString(" ".join(l)).asList())
将输出:
[['a', 'a', ['b', 'a', ['a']], 'a']]
这不是您正在寻找的确切输出,但也许是一个开始。从这里您可以访问每个嵌套列表并向它们添加 {
和 }
。
试试这个
import json
def add_nested_lists(l):
ltemp = '['
last_element = ''
n = len(l)
for i in range(0, n):
element = l[i]
if element == '{':
if l[i-1] == "{":
last_element = '"{", '
ltemp = ltemp[0:len(ltemp) - len(last_element)]
ltemp += '[' + last_element + '"' + element + '", '
last_element = '[' + last_element + '"' + element + '", '
else:
ltemp = ltemp[0:len(ltemp) - len(last_element)]
ltemp += '[' + last_element + '"' + element + '", '
last_element = '[' + last_element + '"' + element + '", '
elif element == "}":
if i == n - 1:
ltemp += '"' + element + '"]' + ']'
last_element = '"' + element + '"]' + ']'
else:
ltemp += '"' + element + '"]' + ', '
last_element = '"' + element + '"]' + ', '
else:
if i == 0 or i != n - 1: # first element or middle elements
ltemp += '"' + element + '", '
last_element = '"' + element + '", '
elif i == n - 1: # last element
ltemp += '"' + element + '"]'
last_element = '"' + element + '"]'
print(ltemp)
ltemp = json.loads(ltemp)
return ltemp
l = ['a','a','{','{','b','a','{','a','}','}','a','}']
print(type(l), add_nested_lists(l))
输出
<class 'list'> ['a', ['a', ['{', '{', 'b', ['a', '{', 'a', '}'], '}'], 'a', '}']]
如果可以并且想要提高效率,请尝试制作字符串而不是列表 'l'
如下
import json
l = '['
last_element = ''
is_last_element_is_curly = False
def add(element, position='m'): # m - middle element
global l, last_element, is_last_element_is_curly
if element == '{':
if is_last_element_is_curly:
last_element = '"{", '
l = l[0:len(l) - len(last_element)]
l += '[' + last_element + '"' + element + '", '
last_element = '[' + last_element + '"' + element + '", '
else:
l = l[0:len(l) - len(last_element)]
l += '[' + last_element + '"' + element + '", '
last_element = '[' + last_element + '"' + element + '", '
is_last_element_is_curly = True
elif element == "}":
if position == 'l':
l += '"' + element + '"]' + ']'
last_element = '"' + element + '"]' + ']'
else:
l += '"' + element + '"]' + ', '
last_element = '"' + element + '"]' + ', '
is_last_element_is_curly = False
else:
if position == 'f' or position == 'm': # f - first element or m - middle element
postfix = '", '
l += '"' + element + '", '
last_element = '"' + element + '", '
elif position == 'l': # l - last element
l += '"' + element + '"]'
last_element = '"' + element + '"]'
is_last_element_is_curly = False
#Do you stuff here and add elements to string 'l'
ltemp = ['a','a','{','{','b','a','{','a','}','}','a','}']
add(ltemp[0], position="f")
for i in range(1,len(ltemp) - 1):
add(ltemp[i])
add(ltemp[i + 1], position="l")
print(l)
#After that it will become very efficient
l = json.loads(l)
print(type(l),l)
我有一个列表 l
l = ['a','a','{','b','a','{','a','}','}','a']
我想把这个列表变成下面的列表。
print(new_l)
# ['a','a',['{','b','a',['{','a','}'],'}'],'a']
所以,基本上,花括号内的所有内容,包括大括号本身,都应该位于原始列表内的列表内。
编辑:谢谢大家的精彩回答。现在,我希望嵌套列表也包含“{”之前的元素吗?我知道我应该一开始就提到这一点,但忘记了这个要求。
print(new_l)
# ['a',['a','{','b',['a','{','a','}'],'}'],'a']
查看 pyparsing
。
from pyparsing import nestedExpr
l = ['a','a','{','b','a','{','a','}','}','a']
l.insert(0, "{")
l.insert(len(l), "}")
print(nestedExpr('{','}').parseString(" ".join(l)).asList())
将输出:
[['a', 'a', ['b', 'a', ['a']], 'a']]
这不是您正在寻找的确切输出,但也许是一个开始。从这里您可以访问每个嵌套列表并向它们添加 {
和 }
。
试试这个
import json
def add_nested_lists(l):
ltemp = '['
last_element = ''
n = len(l)
for i in range(0, n):
element = l[i]
if element == '{':
if l[i-1] == "{":
last_element = '"{", '
ltemp = ltemp[0:len(ltemp) - len(last_element)]
ltemp += '[' + last_element + '"' + element + '", '
last_element = '[' + last_element + '"' + element + '", '
else:
ltemp = ltemp[0:len(ltemp) - len(last_element)]
ltemp += '[' + last_element + '"' + element + '", '
last_element = '[' + last_element + '"' + element + '", '
elif element == "}":
if i == n - 1:
ltemp += '"' + element + '"]' + ']'
last_element = '"' + element + '"]' + ']'
else:
ltemp += '"' + element + '"]' + ', '
last_element = '"' + element + '"]' + ', '
else:
if i == 0 or i != n - 1: # first element or middle elements
ltemp += '"' + element + '", '
last_element = '"' + element + '", '
elif i == n - 1: # last element
ltemp += '"' + element + '"]'
last_element = '"' + element + '"]'
print(ltemp)
ltemp = json.loads(ltemp)
return ltemp
l = ['a','a','{','{','b','a','{','a','}','}','a','}']
print(type(l), add_nested_lists(l))
输出
<class 'list'> ['a', ['a', ['{', '{', 'b', ['a', '{', 'a', '}'], '}'], 'a', '}']]
如果可以并且想要提高效率,请尝试制作字符串而不是列表 'l' 如下
import json
l = '['
last_element = ''
is_last_element_is_curly = False
def add(element, position='m'): # m - middle element
global l, last_element, is_last_element_is_curly
if element == '{':
if is_last_element_is_curly:
last_element = '"{", '
l = l[0:len(l) - len(last_element)]
l += '[' + last_element + '"' + element + '", '
last_element = '[' + last_element + '"' + element + '", '
else:
l = l[0:len(l) - len(last_element)]
l += '[' + last_element + '"' + element + '", '
last_element = '[' + last_element + '"' + element + '", '
is_last_element_is_curly = True
elif element == "}":
if position == 'l':
l += '"' + element + '"]' + ']'
last_element = '"' + element + '"]' + ']'
else:
l += '"' + element + '"]' + ', '
last_element = '"' + element + '"]' + ', '
is_last_element_is_curly = False
else:
if position == 'f' or position == 'm': # f - first element or m - middle element
postfix = '", '
l += '"' + element + '", '
last_element = '"' + element + '", '
elif position == 'l': # l - last element
l += '"' + element + '"]'
last_element = '"' + element + '"]'
is_last_element_is_curly = False
#Do you stuff here and add elements to string 'l'
ltemp = ['a','a','{','{','b','a','{','a','}','}','a','}']
add(ltemp[0], position="f")
for i in range(1,len(ltemp) - 1):
add(ltemp[i])
add(ltemp[i + 1], position="l")
print(l)
#After that it will become very efficient
l = json.loads(l)
print(type(l),l)