根据另一个列表中子字符串的顺序对列表进行排序

时间:2018-07-19 09:06:05

标签: python string list sorting

我有两个字符串列表。

list_one = ["c11", "a78", "67b"]
list_two = ["a", "b", "c"]

使用list_one中的字符串对list_two进行排序以获取以下输出的最短方法是什么?

["a78", "67b", "c11"]

编辑1: 有一个类似的问题Sorting list based on values from another list?,但是在这个问题中,他已经有了生成字符串所需的索引列表,而在这里,我只有子字符串列表。

编辑2: 由于上面列出的示例可能并不完全具有代表性,因此我添加了另一种情况。

list_one是["1.cde.png", "1.abc.png", "1.bcd.png"] list_two是["abc", "bcd", "cde"]。 输出应该是[ "1.abc.png", "1.bcd.png", "1.cde.png"]

例如,如果list_one短于list_two,它仍然可以工作:

list_one是["1.cde.png", "1.abc.png"] list_two是["abc", "bcd", "cde"] 输出应该是[ "1.abc.png", "1.cde.png"]

4 个答案:

答案 0 :(得分:4)

key = {next((s for s in list_one if v in s), None): i for i, v in enumerate(list_two)}
print(sorted(list_one, key=key.get))

这将输出:

['a78', '67b', 'c11']

答案 1 :(得分:1)

尝试

list_one = ["c11", "a78", "67b"]
list_two = ["a", "b", "c"]

[x for y in list_two for x in list_one if y in x]

输出:

["a78", "67b", "c11"]

答案 2 :(得分:1)

假设list_one中的每个项目正好包含list_two中的一个字符,并且您知道这些字符的类别,例如字母,您可以使用regex提取字母,并建立将字符映射到元素的字典。然后,只需为每个字符查找正确的元素。

>>> list_one = ["c11", "a78", "67b"]
>>> list_two = ["a", "b", "c"]
>>> d = {re.search("[a-z]", s).group(): s for s in list_one}
>>> list(map(d.get, list_two))
['a78', '67b', 'c11']
>>> [d[c] for c in list_two]
['a78', '67b', 'c11']

除了到目前为止发布的其他方法(看起来都为O(n²))之外,这只是O(n)。

当然,该方法可以推广到例如一个以上的字符,或第一个字符串的特定位置的字符,但这将始终需要某种模式和有关该模式的知识。例如,对于您最近的示例:

>>> list_one = ["1.cde.png", "1.abc.png", "1.bcd.png"]
>>> list_two = ["abc", "cde"]
>>> d = {re.search("\.(\w+)\.", s).group(1): s for s in list_one}
>>> d = {s.split(".")[1]: s for s in list_one}  # alternatively without re
>>> [d[c] for c in list_two if c in d]
['1.abc.png', '1.cde.png']

答案 3 :(得分:-1)

>>> sorted(list_one, key=lambda x: [i for i,e in enumerate(list_two) if e in x][0])
['a78', '67b', 'c11']