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它的方法不同,我是