我如何获得这样的嵌套列表?
How do I get such a nested lists?
variable tree structure
- nestedList1 variable
aa3
|
aa1 aa2 bb1
\ / /
aa bb
\ /
root
- nestedList2 variable
bb4
|
aa3 bb2 bb3
| \ /
aa1 aa2 bb1 cc1
\ / / |
aa bb cc
\ | /
root
nestedList1 = ['root', ['aa', ['aa1', ['aa3'], 'aa2'], 'bb', ['bb1']]]
nestedList2 = ['root', ['aa', ['aa1', ['aa3'], 'aa2'], 'bb', ['bb1', ['bb2', ['bb4'], 'bb3']], 'cc', ['cc1']]]
def ConvertTraverse(nlist, depth=0):
convertlist = []
for leaf in nlist:
if isinstance(leaf, list):
tmplist = ConvertTraverse(leaf, depth+1)
convertlist.insert(0, tmplist)
else:
convertlist += [leaf]
return convertlist
print ConvertTraverse(nestedList1)
print ConvertTraverse(nestedList2)
- 结果
嵌套列表 1:[[['bb1'], [['aa3'], 'aa1', 'aa2'], 'aa', 'bb'], 'root']
nestedList2: [[['cc1'], [[['bb4'], 'bb2', 'bb3'], 'bb1'], [['aa3'], 'aa1', 'aa2'], 'aa', 'bb', 'cc'], 'root']
我只想要下面的结果。
- 结果
嵌套列表 1:[[[['aa3'], 'aa1', 'aa2'], 'aa', ['bb1'], 'bb'], 'root']
嵌套列表 2:[[[['aa3'], 'aa1', 'aa2'], 'aa', [[['bb4'], 'bb2', 'bb3'], 'bb1'], 'bb', ['cc1'], 'cc'], 'root']
如何获得这样的嵌套列表?
我想要一个嵌套列表,排序为 post-顺序遍历。
基本上,要对列表重新排序需要执行以下操作:每当第 n
个元素是标签,而第 n+1
个元素是子列表时,交换两者。您可以在几行中就地执行此操作:
def reorder(lst):
for i, (cur, nxt) in enumerate(zip(lst, lst[1:])):
if isinstance(cur, str) and isinstance(nxt, list):
reorder(nxt)
lst[i:i+2] = [nxt, cur]
对于非就地解决方案,您可以只创建列表的深层副本,然后在副本上使用它。
我可能在这里不合时宜,或者完全没有抓住要点,但我冒着风险声称我认为如果您将每个分支完全收集到括号中会更容易。即,将每个分支写成独特的 [root, [branch1], [branch2],...]
nestedList1 = ['root', ['aa', ['aa1', ['aa3']], ['aa2']], ['bb', ['bb1']]]
nestedList2 = ['root', ['aa', ['aa1', ['aa3']], ['aa2']], ['bb', ['bb1', ['bb2', ['bb4']], ['bb3']]], ['cc', ['cc1']]]
然后你可以递归地改变顺序,使每个分支第一个离开,主干第二个。
def recursivereverese(l):
if len(l)<=1 or type(l) is not list:
return l
else:
new = []
for k in l[::-1]:
new.append(recursivereverese(k))
return new
修改后的嵌套列表的结果:
In [127]: recursivereverese(nestedList1)
Out[127]: [[['bb1'], 'bb'], [['aa2'], [['aa3'], 'aa1'], 'aa'], 'root']
In [128]: recursivereverese(nestedList2)
Out[128]:
[[['cc1'], 'cc'],
[[['bb3'], [['bb4'], 'bb2'], 'bb1'], 'bb'],
[['aa2'], [['aa3'], 'aa1'], 'aa'],
'root']
这就是你想要的吗?
找到哪个分支更深以进行漂亮的绘图是一个不同的话题。
variable tree structure
- nestedList1 variable
aa3
|
aa1 aa2 bb1
\ / /
aa bb
\ /
root
- nestedList2 variable
bb4
|
aa3 bb2 bb3
| \ /
aa1 aa2 bb1 cc1
\ / / |
aa bb cc
\ | /
root
nestedList1 = ['root', ['aa', ['aa1', ['aa3'], 'aa2'], 'bb', ['bb1']]]
nestedList2 = ['root', ['aa', ['aa1', ['aa3'], 'aa2'], 'bb', ['bb1', ['bb2', ['bb4'], 'bb3']], 'cc', ['cc1']]]
def ConvertTraverse(nlist, depth=0):
convertlist = []
for leaf in nlist:
if isinstance(leaf, list):
tmplist = ConvertTraverse(leaf, depth+1)
convertlist.insert(0, tmplist)
else:
convertlist += [leaf]
return convertlist
print ConvertTraverse(nestedList1)
print ConvertTraverse(nestedList2)
- 结果
嵌套列表 1:[[['bb1'], [['aa3'], 'aa1', 'aa2'], 'aa', 'bb'], 'root']
nestedList2:[[['cc1'], [[['bb4'], 'bb2', 'bb3'], 'bb1'], [['aa3'], 'aa1', 'aa2'], 'aa', 'bb', 'cc'], 'root']
我只想要下面的结果。
- 结果
嵌套列表 1:[[[['aa3'], 'aa1', 'aa2'], 'aa', ['bb1'], 'bb'], 'root']
嵌套列表 2:[[[['aa3'], 'aa1', 'aa2'], 'aa', [[['bb4'], 'bb2', 'bb3'], 'bb1'], 'bb', ['cc1'], 'cc'], 'root']
如何获得这样的嵌套列表? 我想要一个嵌套列表,排序为 post-顺序遍历。
基本上,要对列表重新排序需要执行以下操作:每当第 n
个元素是标签,而第 n+1
个元素是子列表时,交换两者。您可以在几行中就地执行此操作:
def reorder(lst):
for i, (cur, nxt) in enumerate(zip(lst, lst[1:])):
if isinstance(cur, str) and isinstance(nxt, list):
reorder(nxt)
lst[i:i+2] = [nxt, cur]
对于非就地解决方案,您可以只创建列表的深层副本,然后在副本上使用它。
我可能在这里不合时宜,或者完全没有抓住要点,但我冒着风险声称我认为如果您将每个分支完全收集到括号中会更容易。即,将每个分支写成独特的 [root, [branch1], [branch2],...]
nestedList1 = ['root', ['aa', ['aa1', ['aa3']], ['aa2']], ['bb', ['bb1']]]
nestedList2 = ['root', ['aa', ['aa1', ['aa3']], ['aa2']], ['bb', ['bb1', ['bb2', ['bb4']], ['bb3']]], ['cc', ['cc1']]]
然后你可以递归地改变顺序,使每个分支第一个离开,主干第二个。
def recursivereverese(l):
if len(l)<=1 or type(l) is not list:
return l
else:
new = []
for k in l[::-1]:
new.append(recursivereverese(k))
return new
修改后的嵌套列表的结果:
In [127]: recursivereverese(nestedList1)
Out[127]: [[['bb1'], 'bb'], [['aa2'], [['aa3'], 'aa1'], 'aa'], 'root']
In [128]: recursivereverese(nestedList2)
Out[128]:
[[['cc1'], 'cc'],
[[['bb3'], [['bb4'], 'bb2'], 'bb1'], 'bb'],
[['aa2'], [['aa3'], 'aa1'], 'aa'],
'root']
这就是你想要的吗?
找到哪个分支更深以进行漂亮的绘图是一个不同的话题。