python - 在没有其他子字符串的情况下对子字符串进行排序
问题描述
从昨天开始,我一直在尝试对数据进行排序,但我需要帮助,因为我做不到。
我有
list_one = [
['HSubBbb'], ['Aaa'], ['Sub2XAaa'], ['BusXDdd'], ['CccSub2'],
['BusBbb'], ['HBusXAaa'], ['Ccc'], ['HSub2XDdd'], ['CccSub'],
['Sub2Bbb'], ['Bbb'], ['SubXAaa'], ['SubDdd'], ['CccBus']
]
list_two = ['Sub', 'Bus', 'Sub2']
我需要
[
['Aaa'], ['Bbb'], ['Ccc'],
['SubXAaa'], ['HSubBbb'], ['CccSub'], ['SubDdd'],
['HBusXAaa'], ['BusBbb'], ['CccBus'], ['BusXDdd'],
['Sub2XAaa'], ['Sub2Bbb'], ['CccSub2'], ['HSub2XDdd']
]
我做了几个测试,例如
[x for y in list_two for x in list_one if y in x[0]]
或者
def my_list(t1, t2):
def replace(s):
s = s[0]
for u in list_two:
s = s.replace(u + 'X', '').replace(u, '').replace('H', '')
return s
t1 = replace(t1)
t2 = replace(t2)
return t1 < t2
print(sorted(list_one, key=functools.cmp_to_key(my_list)))
解决方案
排序的主要排序标准是list_two
,但在该组中,必须删除该值以进行进一步排序。此外,像“Sub”和“Sub2”这样的排序标准会发生冲突,因为删除“Sub”例如“Sub2Bbb”会留下“2Bbb”。当然,额外的字母“H”和“X”必须被删除以进行排序。
所以我们必须先测试并去掉最长的标准,但是我们必须想办法保持原来的排序顺序。enumerate
可以帮忙。
sorted(list(enumerate(list_two)), key=lambda x: len(x[1]), reverse=True)
这会给我们
[(2, 'Sub2'), (0, 'Sub'), (1, 'Bus')]
如果我们遍历这个列表,我们在“Sub”之前处理“Sub2”并且仍然知道原始位置在哪里。
现在把它们放在一起。
list_one = [
['HSubBbb'], ['Aaa'], ['Sub2XAaa'], ['BusXDdd'], ['CccSub2'],
['BusBbb'], ['HBusXAaa'], ['Ccc'], ['HSub2XDdd'], ['CccSub'],
['Sub2Bbb'], ['Bbb'], ['SubXAaa'], ['SubDdd'], ['CccBus']
]
list_two = ['Sub', 'Bus', 'Sub2']
def sort_function(key):
value = key[0]
value = value.replace('X', '').replace('H', '')
for entry in sort_criteria:
if entry[1] in value:
return (entry[0], value.replace(entry[1], ''))
return (-1, value) # default, no entry in sort criteria
sort_criteria = sorted(list(enumerate(list_two)), key=itemgetter(1), reverse=True)
list_one.sort(key=sort_function)
print(sort_criteria)
print(list_one)
结果:
[['Aaa'], ['Bbb'], ['Ccc'], ['SubXAaa'], ['HSubBbb'], ['CccSub'], ['SubDdd'], ['HBusXAaa'], ['BusBbb'], ['CccBus'], ['BusXDdd'], ['Sub2XAaa'], ['Sub2Bbb'], ['CccSub2'], ['HSub2XDdd']]
您可以添加一个输出sort_function
以查看发生了什么。在循环返回之前添加print(key, (entry[0], value.replace(entry[1], '')))
,您可以看到原始值和用于排序的键。
推荐阅读
- php - 使用php在json中分组相同的名称
- python - 由 Windows 任务计划程序执行的 Python 脚本中的多处理
- javascript - 如果元素的出现次数超过 n 次,则删除该元素的出现次数 javascript
- r - 合并三个数据集后没有得到所有变量
- c# - 有没有可能简化数据网格列?
- sails.js - 如何识别上传的图片是恶意的(使用 SailsJS 和 Skipper)?
- reactjs - 在 React / Gatsby 中滚动时,在哪里放置 componentDidMount 以更改链接导航栏颜色?
- android - 测试室迁移。在资产文件夹中找不到架构文件
- r - 使用 div 标签获取级别指示器
- java - 具有继承和 JPA 的 Lombok @Builder