我有两个字符串列表。
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"]
答案 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']