我有一个列名列表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:)
答案 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']
答案的两个部分:
List-comprehension
循环认为special
名称和。{
如果它们存在于name_column
。name_column
的所有元素
特殊 几点评论:
sorted()
上的list(temp2)
来电,以加快代码速度。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']