python - 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']
列表应该完全按照给定的字符串排序。有没有一种有效的方法来实现这一目标?
解决方案
这会产生所需的图案。虽然它在技术上不是一种排序 - 只是排序字符串的正则表达式搜索。
>>> 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
.
推荐阅读
- python - 基于 Pandas 数据框中的通配符在字典中查找
- excel - 使用 Excel 以 30 分钟间隔计算总计划
- python - 如何通过模块的相对路径读取模块中的文件?
- c# - 防止在按相同值更新时调用 DataColumn.ColumnChanged 事件
- warnings - 如何克服“警告:instruction_reg 的端口 8(目标)需要 8 位,得到 1。” 在verilog?
- java - 安装 java 链码抛出无效内存地址错误
- angular - Angular 6 - 单击时创建下一个(子/表单)组件。单击时复制组件。生成多个子表单
- file - Maya 文件节点查询颜色空间
- c# - 使用 LINQ 填充具有单列值的字符串
- javascript - 如何在数组js中转换对象