高级列表排序

时间:2018-12-03 10:21:54

标签: python

我正在尝试在更高级的列表中对列表进行排序。我正在处理的列表具有以下格式:

  1. 001混凝土

  2. 005深色木

  3. 001 021

  4. 002油毡

  5. 031黑色混凝土

  6. 003012

  7. 005 051

  8. 005 331

  9. 024轻木

我想按顺序对列表进行排序,因为索引0-2始终是数字,所以它们首先被排序,然后(从那里开始的索引3 :)字母优先,因为它们是标题。它应该像这样对列表进行排序:

  1. 001混凝土

  2. 001 021

  3. 002油毡

  4. 003012

  5. 005深色木

  6. 005 051

  7. 005 331

  8. 024轻木

  9. 列表项

  10. 031黑色混凝土

到目前为止,我尝试删除标题索引,排序和替换项目的项目,但均未成功。

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

如果您想对字符串进行排序,则可以使用以下代码来完成:

a = ["001 Concrete", "005 Wood, dark", "001 021", "002 Linoleum", "031 Concrete, dark", "003 012", "005 051", "005 331", "024 Wood, light"]

def key_first(string):
    return string.split()[0]

def key_second(string):
    # first - detect if we deal with words or numbers
    val = string.split()[1][0].isdigit()
    # if numbers - it is ok
    if val:
        return string.split()[1]
    # if words - they should go before numbers - let's add space
    else:
        return ' ' + string.split()[1]

# sort words and secondary numbers
result = sorted(a, key=key_second)
# sort primary numbers
result = sorted(result, key=key_first)

该代码似乎可以在示例数据上提供所需的输出。

答案 1 :(得分:1)

以下是@Poolka提供的(略作修改的)答案,并在其评论的评论中描述了并要求提供一些附加拉链。

list0=IN[0]
list1=IN[1]
list2=IN[2]
list3=IN[3]

def key_first(string):
    return string[0].split()[0]

def key_second(string):
    if string[0].split()[1][0].isdigit():
        return string[0].split()[1]
    else:
        return " " + string[0].split()[1]


list0,list1,list2,list3 = zip(*sorted(zip(list0,list1,list2,list3),key=key_second))

list0,list1,list2,list3 = zip(*sorted(zip(list0,list1,list2,list3),key=key_first))

在这里,我将输出设置为:

OUT = [list,list1,list2,list3]