【发布时间】:2015-12-01 16:57:17
【问题描述】:
我有 2 个 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 = [['Ab'], ['QrB', 'Zr'], [['GtB', 'MhB', 'Nt6B'], ['DbB', 'Cb6B5']]]
有没有办法得到这个list_c?
其他信息: 列表将始终被定义为:
- 来自
list_a的部分字符串将始终在list_b中找到。例如。对于一个列表中的Gt,第二个列表中将有Gt或GtB。 - 每个列表中的条目不能以不同的顺序排列 - 即如果
Qr在一个列表中位于Zr之前,那么它(Qr或QrB)必须在第二个列表中位于Zr之前。 - 每个列表最多可以包含 20 个字符串。
- 每个列表只有唯一的字符串。例如。
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'] 应该组合['QrB','Zr'],就像它们在list_a 中组合一样。
尝试 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 中执行此操作的正确方法。有没有更 Pythonic 的方式来做到这一点?
【问题讨论】:
-
你能说明 1. 逻辑 2. 你试过什么?
-
您确定您的示例数据正确吗?不知道如何从
[..., 'DvB', 'Cb6B5']获得['Mg0', 'Cb605'] -
@achampion,谢谢。修正了问题。
-
为,为,为,为,永远不是做任何事的方式……
-
如果在
list_b中找不到来自list_a的部分字符串怎么办?反之亦然?它们在 2 个列表中的顺序可以不同吗?列表是否像您的示例一样短,或者它们可能很长?是否有一组固定的代码可以从中提取list_a和list_b中的字符串?价值观都是独一无二的吗? ... 等等。如果您可以提供更多示例或一些上下文,您可能会得到更好的解决方案。
标签: python list python-2.7