Python 对列表进行排序并强制将某些元素放在第一位

Python 对列表进行排序并强制将某些元素放在第一位,python,list,sorting,Python,List,Sorting,我有一个列名列表,name\u列。该列表包含特殊列名以及非特殊列名的子集。特殊列名存储在列表特殊列中。我想对name\u列进行排序,以便特殊列名在排序列表中首先出现,顺序与它们在special\u列中列出的顺序相同 非特殊列名的顺序其实并不重要,只要它们出现在特殊列之后 范例 special_columns = ['from_date', 'to_date', 'id_1', 'id_2', 'id_3', 'id_4'] name_columns = ['a', 'id_2', 'from_d

我有一个列名列表,
name\u列
。该列表包含特殊列名以及非特殊列名的子集。特殊列名存储在列表
特殊列
中。我想对
name\u列
进行排序,以便特殊列名在排序列表中首先出现,顺序与它们在
special\u列
中列出的顺序相同

非特殊列名的顺序其实并不重要,只要它们出现在特殊列之后

范例

special_columns = ['from_date', 'to_date', 'id_1', 'id_2', 'id_3', 'id_4']
name_columns = ['a', 'id_2', 'from_date', 'to_date', 'id_4', 'c']

#Do some smart sorting
#After sorting
name_columns = ['from_date', 'to_date', 'id_2', 'id_4', 'a', 'c']
我有多个列表,比如
name\u列
,它们都包含
特殊列
的不同子集(不包括)。
关于如何实现这一点有什么建议吗?

尝试使用
函数作为
排序的参数:

>>> special_columns = ['from_date', 'to_date', 'id_1', 'id_2', 'id_3', 'id_4']
>>> name_columns = ['a', 'id_2', 'from_date', 'to_date', 'id_4', 'c']
>>> print(sorted(name_columns,key=lambda x: special_columns.index(x) if x in special_columns else 10e99))

['from_date', 'to_date', 'id_2', 'id_4', 'a', 'c']

尝试使用
函数作为排序的
参数:

>>> special_columns = ['from_date', 'to_date', 'id_1', 'id_2', 'id_3', 'id_4']
>>> name_columns = ['a', 'id_2', 'from_date', 'to_date', 'id_4', 'c']
>>> print(sorted(name_columns,key=lambda x: special_columns.index(x) if x in special_columns else 10e99))

['from_date', 'to_date', 'id_2', 'id_4', 'a', 'c']
这样怎么样:

special_columns = ['from_date', 'to_date', 'id_1', 'id_2', 'id_3', 'id_4']
name_columns = ['a', 'id_2', 'from_date', 'to_date', 'id_4', 'c']

temp2 = set(name_columns).difference(special_columns)
sorted_cols = [a for a in special_columns if a in name_columns] + sorted(list(temp2))
#             \_____________________1________________________/    \_______2_________/
print(sorted_cols)  # ['from_date', 'to_date', 'id_2', 'id_4', 'a', 'c']
答案分为两部分:

  • List comprehension
    循环思考
    special
    名称和 如果它们存在于
    name\u列中,则将它们存储在结果中
  • 设置操作以处理
    name\u列
    中所有未指定的元素 特别的

  • 几句话:

  • 如果非特殊项目的排序不重要,您可以删除
    sorted()
    调用
    list(temp2)
    来加快代码的速度
  • 当然,不需要定义
    temp2
  • 这样怎么样:

    special_columns = ['from_date', 'to_date', 'id_1', 'id_2', 'id_3', 'id_4']
    name_columns = ['a', 'id_2', 'from_date', 'to_date', 'id_4', 'c']
    
    temp2 = set(name_columns).difference(special_columns)
    sorted_cols = [a for a in special_columns if a in name_columns] + sorted(list(temp2))
    #             \_____________________1________________________/    \_______2_________/
    print(sorted_cols)  # ['from_date', 'to_date', 'id_2', 'id_4', 'a', 'c']
    
    答案分为两部分:

  • List comprehension
    循环思考
    special
    名称和 如果它们存在于
    name\u列中,则将它们存储在结果中
  • 设置操作以处理
    name\u列
    中所有未指定的元素 特别的

  • 几句话:

  • 如果非特殊项目的排序不重要,您可以删除
    sorted()
    调用
    list(temp2)
    来加快代码的速度
  • 当然,不需要定义
    temp2

  • 您真的需要对列表进行排序吗?您只需创建一个新的“排序”并使用它。比如:

    special_columns = ['from_date', 'to_date', 'id_1', 'id_2', 'id_3', 'id_4']
    name_columns = ['a', 'id_2', 'from_date', 'to_date', 'id_4', 'c']
    a = []
    
    
    for el in name_columns:
        if el in special_columns:
            a.insert(0, el)#insert in the beggining of the resulting list
        else:
            a.append(el)
    
    print a
    ['id_4', 'to_date', 'from_date', 'id_2', 'a', 'c']
    

    您真的需要对列表进行排序吗?您只需创建一个新的“排序”并使用它。比如:

    special_columns = ['from_date', 'to_date', 'id_1', 'id_2', 'id_3', 'id_4']
    name_columns = ['a', 'id_2', 'from_date', 'to_date', 'id_4', 'c']
    a = []
    
    
    for el in name_columns:
        if el in special_columns:
            a.insert(0, el)#insert in the beggining of the resulting list
        else:
            a.append(el)
    
    print a
    ['id_4', 'to_date', 'from_date', 'id_2', 'a', 'c']
    

    一种方法是创建一个包含特殊项目订单信息的dict。事先创建dict比对每个要排序的项目调用
    .index
    方法要高效得多。诀窍是为非特殊项指定零,为特殊项指定负数,然后反向排序,以便非特殊项始终位于排序列表的末尾

    special_columns = ['from_date', 'to_date', 'id_1', 'id_2', 'id_3', 'id_4']
    name_columns = ['a', 'id_2', 'from_date', 'to_date', 'id_4', 'c']
    
    special_order = {u: i for i, u in enumerate(reversed(special_columns), 1)}
    name_columns.sort(key=lambda s: special_order.get(s, 0), reverse=True)
    print(name_columns)
    
    输出

    ['from_date', 'to_date', 'id_2', 'id_4', 'a', 'c']
    

    一种方法是创建一个包含特殊项目订单信息的dict。事先创建dict比对每个要排序的项目调用
    .index
    方法要高效得多。诀窍是为非特殊项指定零,为特殊项指定负数,然后反向排序,以便非特殊项始终位于排序列表的末尾

    special_columns = ['from_date', 'to_date', 'id_1', 'id_2', 'id_3', 'id_4']
    name_columns = ['a', 'id_2', 'from_date', 'to_date', 'id_4', 'c']
    
    special_order = {u: i for i, u in enumerate(reversed(special_columns), 1)}
    name_columns.sort(key=lambda s: special_order.get(s, 0), reverse=True)
    print(name_columns)
    
    输出

    ['from_date', 'to_date', 'id_2', 'id_4', 'a', 'c']
    
    在一行中,您尝试:

    详细解决方案:

    输出:

    ['from_date', 'to_date', 'id_2', 'id_4', 'a', 'c']
    
    在一行中,您尝试:

    详细解决方案:

    输出:

    ['from_date', 'to_date', 'id_2', 'id_4', 'a', 'c']
    


    'id_1'
    发生了什么事?它不在要排序的列表中。啊,我明白了。好的。您不能对列表进行排序,或者您不知道如何在列表中设置带有索引的项?我想根据问题中概述的特殊规则对其进行排序。
    'id_1'
    发生了什么事?它不在要排序的列表中。啊,我明白了。好的。你们不能对列表进行排序,或者你们不知道如何在列表中设置一个带有索引的项目?我想根据问题中列出的特殊规则对它进行排序。是的。。。我不需要把它分类。请注意,
    insert
    方法不是很有效,尤其是在列表开头附近插入时,因为每次执行插入时都必须移动所有后续项。是的,这种情况在C速度下发生,但如果你能避免的话还是更好的。是的。。。我不需要把它分类。请注意,
    insert
    方法不是很有效,尤其是在列表开头附近插入时,因为每次执行插入时都必须移动所有后续项。是的,这种情况在C速度下发生,但是如果你能避免它,那就更好了。谢谢。我想我会选择这样一个:)@ElisByberi如果你要对这样一个问题的每个答案投反对票,你最好写一个脚本,让它在这一生中完成。我也会帮助你。我投了反对票,因为我们不是来做作业的。@ElisByberi我看不到你鼓励OP发布他可能为任务编写的代码,或者对问题投了反对票。我鼓励OP将他的问题简化为:如何在列表中创建项?我们在这里相互学习,而不是提供免费的解决方案。谢谢。我想我会选择这样一个:)@ElisByberi如果你要对这样一个问题的每个答案投反对票,你最好写一个脚本,让它在这一生中完成。我也会帮助你。我投了反对票,因为我们不是来做作业的。@ElisByberi我看不到你鼓励OP发布他可能为任务编写的代码,或者对问题投了反对票。我鼓励OP将他的问题简化为:如何在列表中创建项?我们在这里相互学习,而不是提供免费的解决方案。谢谢。这与@v100ev给出的答案非常相似(虽然不完全相同)@mortysporty其方法不同,我在移除,然后在插入时扩展。:)非常感谢。这与@v100ev给出的答案非常相似(虽然不完全相同)@mortysporty它的方法不同,我是