首页 > 解决方案 > 在没有其他子字符串的情况下对子字符串进行排序

问题描述

从昨天开始,我一直在尝试对数据进行排序,但我需要帮助,因为我做不到。

我有

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

标签: python

解决方案


排序的主要排序标准是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], ''))),您可以看到原始值和用于排序的键。


推荐阅读