首页 > 解决方案 > Python:根据另一个字符串对相似字符串的列表进行排序

问题描述

我有一个字符串

deplete mineral resources , from 123 in x 123 in x 19 ft , on 24 ft t shaped hole

和一个字符串列表

['123', '123', '19', '24', 'in', 'in', 'ft', 'ft', 'deplete mineral', 't', 'resources', 'shaped hole']

我想根据给定的字符串对这个列表进行排序。当我这样做时sorted(l, key=s.index),我得到的输出为:

['deplete mineral', 't', 'in', 'in', 'resources', '123', '123', '19', 'ft', 'ft', '24', 'shaped hole']

但我想要的输出是:

['deplete mineral', 'resources', '123', 'in' , '123', 'in' , '19', 'ft', '24', 'ft', 't' , 'shaped hole']

列表应该完全按照给定的字符串排序。有没有一种有效的方法来实现这一目标?

标签: pythonstringlistsorting

解决方案


这会产生所需的图案。虽然它在技术上不是一种排序 - 只是排序字符串的正则表达式搜索。

>>> import re
>>>
>>> sort_str = "deplete mineral resources , from 123 in x 123 in x " \
...            "19 ft , on 24 ft t shaped hole"
>>> 
>>> str_list = ['123', '123', '19', '24', 'in', 'in', 'ft', 'ft', 
...             'deplete mineral', 't', 'resources', 'shaped hole']
>>> 
>>> re.findall('|'.join(str_list), sort_str)
['deplete mineral', 'resources', '123', 'in', '123', 'in', '19', 
 'ft', '24', 'ft', 't', 'shaped hole']
>>>
>>>
>>> desired = ['deplete mineral', 'resources', '123', 'in' , '123', 
...            'in' , '19', 'ft', '24', 'ft', 't' , 'shaped hole']
>>> desired == re.findall('|'.join(str_list), sort_str)
True

则表达式很简单。它的形式"alt_1|alt_2|alt_3"。类似 OR 的表达式产生的是一个模式匹配器,它扫描字符串以查找子字符串“alt_1”、“alt_2”或“alt_3”。

str_list以这种简单的方式连接在一起形成这个类似 OR 的表达式:

>>> '|'.join(str_list)
'123|123|19|24|in|in|ft|ft|deplete mineral|t|resources|shaped hole'

上述表达式的顺序并不重要——它们可以是任何顺序。

re.findall()当作为第一个参数传入并用于查找所有匹配的子字符串时,此字符串表达式在内部转换为正则表达式,sort_str其中包含以下行:

>>> re.findall('|'.join(str_list), sort_str)

re.findall()sort_str从头到尾扫描寻找属于str_list. 每次出现都会添加到它返回的列表中。

因此匹配的子字符串将与sort_str.


推荐阅读