如何根据另一个列表的顺序重新排序列表?

How to reorder list based off of another list's ordering?

我有一个按特定顺序排列的列表,比如 ['hello', 'I', 'like', 'sunshine'],我有第二个列表,其中包含第一个列表的所有内容和一些额外元素 ['You', 'like', 'pie', 'sunshine', 'and', 'rainbows', 'hello', 'I']。这是一个荒谬的例子,但本质上主要思想是第一个列表是第二个列表的子集,但是第一个列表中的元素出现的顺序与它们最初出现的顺序不同(它们在第二个列表中被打乱了列表)。我想对第二个列表重新排序,以便它以原始顺序从第一个列表开始的元素开始,然后具有其独特的元素。因此,这个重新排序的第二个列表需要 ['hello', 'I', 'like', 'sunshine', 'You', 'pie', 'and', 'rainbows']

希望这是有道理的。我实际上并不关心唯一元素如何出现在最终重新排序的列表中(它们可以根据我的关心重新排列,但至关重要的是第一个列表中的元素出现在开头并保持原始顺序)。我如何实现这一目标?我有点迷茫。

您可以采用 List1,并将 List2 中不在 List1 中的每个项目追加到 List1 中。

l1 = ['hello', 'I', 'like', 'sunshine']
l2 = ['You', 'like', 'pie', 'sunshine', 'and', 'rainbows', 'hello', 'I']

new_list = l1.copy()

for item in l2:
    if item not in l1:
        new_list.append(item)

print(new_list)

输出:

['hello', 'I', 'like', 'sunshine', 'You', 'pie', 'and', 'rainbows']

这是一个不错的单行解决方案:

a = ['hello', 'I', 'like', 'sunshine']
b = ['You', 'like', 'pie', 'sunshine', 'and', 'rainbows', 'hello', 'I']

b = sorted(b, key=lambda x: a.index(x) if x in a else len(a) + b.index(x))
# b = ['hello', 'I', 'like', 'sunshine', 'You', 'pie', 'and', 'rainbows']