【发布时间】:2017-10-19 20:36:12
【问题描述】:
给定两个带后缀的列表:
l1 = ['C_1', 'B_1', 'A']
l2 = ['B_2', 'C_2', 'D']
我想这样组合它们:
['C_1', 'C_2', 'B_1', 'B_2', 'A', 'D']
元素将与l1 作为锚点组合。这意味着,如果C_* 在l1 中出现在B_* 之前,输出中将保留相同的顺序。此外,具有相同前缀C_* 的元素将按后缀升序排列在一起。带后缀的元素按照它们出现的顺序放置,如上所示。
您可以假设l1 中的所有元素都有后缀_1,而l2 中的所有元素都有后缀_2。
我试过这个:
from collections import OrderedDict
from itertools import chain
o = OrderedDict()
for x in l1 + l2:
o.setdefault(x.split('_')[0], []).append(x)
result = list(chain.from_iterable(o.values()))
哪个有效,但想知道是否有更简洁的方法。
编辑:
后缀只是该元素出现在哪个列表中的一个代表。假设我有来自l1 的C_1 和来自l2 的C_2,然后C_* 元素根据哪个在@ 中出现987654338@ 并且在 l2 中,在最终列表中(所以,它应该是 ... C_1, C_2...)。
此外,l1 和 l2 中的所有元素都是独一无二的。希望对您有所帮助。
【问题讨论】:
-
l2的顺序重要吗?不在您的示例数据中,因为只有一个元素没有来自l1的后缀/组 -
@Jean-FrançoisFabre
l1订购是这里的锚。l2元素在最终列表中的顺序无关紧要。 -
你的意思是numerical后缀,还是lexicographical后缀?
-
@WillemVanOnsem 真的,后缀只是代表该元素出现在哪个列表中。假设我有来自 l1 的 C_1 和来自 l2 的 C_2,然后 C_ 元素基于 l1 中的哪个出现并且在 l2 中,在最终列表中(所以,它会是 ... C_1,C_2 ...)。我希望这能解决问题!
-
你也可以假设后缀总是数字,如果有帮助的话。