根据 python 中的多个正则表达式组对字符串列表进行排序

Sorting list of strings based on multiple regex groups in python

我有以下形式的字符串列表:

my_list=['i99_W_t10', 'i99_M_t11', 'i94_M_t12', 'i93_W_t2', ..., 'i14_M_t19']

(所以总是由 _ 分隔的 3 个字段。我想先按第二个元素对这个列表进行排序,然后是第三个元素,然后是第一个元素。所以上面的列表将变为:

my_list=['i99_M_t11',  'i94_M_t12', 'i14_M_t19', 'i93_W_t2', 'i99_W_t10', ... ]

我知道如何通过将列表转换为 pandas 数据框、将字段拆分为列、对它们进行排序并返回排序后的列表来实现这一点。但也许有一种更优雅的方式直接在列表上完成,而不是必须去寻找数据帧?

拆分 '_' 上的每个字符串,然后使用 operator.itemgetter 按您的特定顺序从每个列表中提取项目

from operator import itemgetter
my_list=['i99_W_t10', 'i99_M_t11', 'i94_M_t12', 'i93_W_t2','i14_M_t19']
key_func = lambda x: itemgetter(1, 2, 0)(x.split('_'))
sorted(my_list, key=key_func)
# ['i99_M_t11', 'i94_M_t12', 'i14_M_t19', 'i99_W_t10', 'i93_W_t2']

itemgetter 实例

itemgetter(1, 2, 0)(['a', 'b', 'c'])
# ('b', 'c', 'a')

itemgetter(2, 1, 0)(['a', 'b', 'c'])
# ('c', 'b', 'a')

你可以这样做...

my_list = ['i99_W_t10', 'i99_M_t11', 'i94_M_t12', 'i93_W_t2', 'i14_M_t19']
# print(my_list)

def getValuesFromListItem(n):
    global my_list
    mvl = []
    for i in my_list:
        mvl += [i.split("_")[n]]
    return mvl

def getListItemFromValue(val, n):
    res = ""
    global my_list
    k = 0
    for i in my_list:
        l = i.split("_")
        if l[n] == val:
            res = i
            del my_list[k]
            break
        k += 1
    return res

l1 = getValuesFromListItem(1)
l2 = sorted(l1)
my_list2 = []
for i in l2:
    my_list2.append(getListItemFromValue(i, 1))

my_list = my_list2
my_list2 = []

l1 = getValuesFromListItem(2)
l2 = sorted(l1)
for i in l2:
    my_list2.append(getListItemFromValue(i, 2))

my_list = my_list2
my_list2 = []

l1 = getValuesFromListItem(0)
l2 = sorted(l1)
for i in l2:
    my_list2.append(getListItemFromValue(i, 0))

print(my_list2)

输出-

['i99_W_t10', 'i99_M_t11', 'i94_M_t12', 'i93_W_t2', 'i14_M_t19']

['i14_M_t19', 'i93_W_t2', 'i94_M_t12', 'i99_W_t10', 'i99_M_t11']