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

时间:2017-11-07 12:40:23

标签: python list sorting

我有一个列名列表name_columns。该列表包含特殊列名称的子集以及非特殊列名称。特殊列名称存储在列表special_columns中。我想对name_columns进行排序,以便特殊列名称首先出现在排序列表中,按照special_columns中列出的顺序排列。

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

实施例

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_columns,它们都包含special_columns的各种子集(包括没有)。 有关如何实现这一目标的任何建议吗?

坚韧的人群,5个答案而不是一个关于这个问题的upvote:)

5 个答案:

答案 0 :(得分:2)

这样怎么样:

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']

答案的两个部分:

  1. List-comprehension循环认为special名称和。{ 如果它们存在于name_column
  2. 中,则将它们存储在结果中
  3. 设置操作以处理name_column的所有元素 特殊
  4. 几点评论:

    1. 如果非特殊项目的排序不重要,您可以移除sorted()上的list(temp2)来电,以加快代码速度。
    2. 当然不需要定义temp2

答案 1 :(得分:1)

尝试使用key函数作为sorted的参数:

>>> 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']

答案 2 :(得分:1)

你真的需要对列表进行排序吗?你可以创建一个新的"排序"一个并使用它。类似的东西:

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']

答案 3 :(得分:1)

执行此操作的一种方法是创建包含特殊项目的订单信息的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']

答案 4 :(得分:1)

  

在一行中你试试:

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']


new=[]
final=[[new.append(item),name_columns.remove(item)]  for item in special_columns if item in name_columns]

new.extend(name_columns)

print(new)
  

详细解决方案:

ordered=[]
for item in special_columns:
    if item in name_columns:
        ordered.append(item)
        name_columns.remove(item)


ordered.extend(name_columns)
print(ordered)

输出:

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