我正在尝试在更高级的列表中对列表进行排序。我正在处理的列表具有以下格式:
001混凝土
005深色木
001 021
002油毡
031黑色混凝土
003012
005 051
005 331
024轻木
我想按顺序对列表进行排序,因为索引0-2始终是数字,所以它们首先被排序,然后(从那里开始的索引3 :)字母优先,因为它们是标题。它应该像这样对列表进行排序:
001混凝土
001 021
002油毡
003012
005深色木
005 051
005 331
024轻木
列表项
031黑色混凝土
到目前为止,我尝试删除标题索引,排序和替换项目的项目,但均未成功。
感谢您的时间。
答案 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]