我有两个Python列表:
list_a = [[['Ab'], ['Qr', 'Zr']], [['Gt', 'Mh', 'Nt'], ['Dv', 'Cb']]]
list_b = [['Ab', 'QrB', 'Zr'], ['GtB', 'MhB', 'Nt6B', 'DvB', 'Cb6B5']]
我需要基于list_a
取消list_b
的展平。我需要:
有没有办法得到这个list_c
?在
其他信息: 列表的定义应确保:
list_a
的部分字符串将始终位于list_b
中。例如,对于一个列表中的Gt
,第二个列表中将有Gt
或{Qr
在Zr
之前,那么它(Qr
或{Zr
之前。在Gt
在任何列表中不能出现2次或更多次。在尝试:
以下是我尝试过的:
list_c = [[],[]]
for ty,iten in enumerate(list_b):
for q in iten:
for l_e in list_a:
for items in l_e:
for t,qr in enumerate(items):
if qr in q:
list_c[ty].append([q])
其输出为:
[[['Ab'], ['QrB'], ['Zr']], [['GtB'], ['MhB'], ['Nt6B'], ['DbB'], ['Cb6B5']]]
问题是['QrB'], ['Zr']
应该组合成{
尝试2:
for ty,iten in enumerate(list_b):
for q in iten:
for l_e,m in enumerate(list_a):
for ss,items in enumerate(m):
for t,qr in enumerate(items):
if qr in q:
list_a[l_e][ss][t] = q
这样可以工作并产生所需的输出:
[[['Ab'], ['QrB', 'Zr']], [['GtB', 'MhB', 'Nt6B'], ['DvB', 'Cb6B5']]]
但是,它(尝试2)太长了,我想知道:在Python中,这似乎不是正确的方法。有没有一种更像Python的方法?在
这是用于任意嵌套深度的递归变量。不太漂亮,但应该有用。在
考虑到任务相当复杂的性质,您的代码看起来不会太长(在一个列表中查找一个列表,并根据前两个字母将其与另一个列表中的列表进行匹配,然后将原始值替换为保留原始列表嵌套结构的匹配值…)
您至少可以消除一个这样的循环:
如果您想要一个更通用的解决方案,它可能会像@Tibor的答案那样涉及递归。在
编辑:给定您提供的额外信息,您可以递归地处理}的平坦版本的迭代器将所有短字符串替换为其完整版本。这使用了这样一个事实:字符串在两个列表中以相同的顺序出现,没有重复项。在
^{pr2}$list_a
,用基于{或者,您可以获取两个列表中每个字符串的索引的扁平化列表,然后循环这些索引:
如果您只关心}的子列表:
list_a
中的子列表的长度,那么可以将list_a
转换为其子列表的长度,然后使用它来切片{
^{pr2}$list_c
的值:相关问题 更多 >
编程相关推荐