【问题标题】:Python: Sort list of similar strings based on another stringPython:根据另一个字符串对相似字符串的列表进行排序
【发布时间】:2021-09-26 20:07:45
【问题描述】:

我有一个字符串

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']

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

【问题讨论】:

  • 你为什么使用pandas标签?在您的问题中,我没有发现任何关于 pandas 的信息!请尝试删除它。
  • 为什么要这样做?这是一个单一的操作还是应该重复发生的事情?你总是比较同一个字符串吗?
  • @Kshitiz 抱歉,我会尽快修改
  • @JohanL 是的,必须重复进行,每次字符串和值列表发生变化时

标签: python string list sorting


【解决方案1】:

这会产生所需的模式。但从技术上讲,它不是一种排序 - 只是排序字符串的正则表达式搜索。

>>> 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

regular expression 很简单。它的形式为"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中的单词顺序相同。

【讨论】:

  • 感谢您的回复!你能解释一下你在这里做了什么吗?用“I”连接字符串的目的是什么?
  • 当然..我会添加一些解释。
  • 非常感谢您的解释!现在更清楚了!
  • 不客气 =) 我希望这能满足您需要的排序操作类型的要求。正如我所说,这在技术上不是排序操作,但它会按照扫描的顺序匹配单词。
  • 是的,在这种情况下,也许排列比排序更好。再次感谢您的解释,它也满足其他情况:)
猜你喜欢
  • 2021-03-27
  • 2015-09-11
  • 2014-08-30
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 2021-06-25
  • 2021-12-20
相关资源
最近更新 更多