如何在python中自定义列表排序

时间:2018-01-16 13:28:41

标签: python python-3.x list sorting dictionary

我有一个标有数据的列表,我想按以下方式订购:

Key order = 'ID', 'GE','FN','LN','MN','EM', 'ST'

Data = ['ID:123 GE:m FN:Amir LN:Maleki EM:a@b.c MN:0400101010  ST:VIC']

我设法在这样的字典中订购它:

d= {'ID':123, 'GE':'m', 'FN':'Amir', 'LN':'Maleki', 'MN':'0400101010', 'EM':'a@b.c', 'ST':'VIC'}

keyorder = ['ID', 'GE','FN','LN','MN','EM', 'ST']

final = sorted(d.items(), key=lambda i:keyorder.index(i[0]))

print(final)

[('ID', 123), ('GE', 'm'), ('FN', 'Amir'), ('LN', 'Maleki'), ('MN', '0400101010'), ('EM', 'a@b.c'), ('ST', 'VIC')]

但是我可以在不将列表变成字典的情况下这样做。如果不是我怎么把列表变成一个字典? 谢谢!!

3 个答案:

答案 0 :(得分:3)

首先,将keyorder设为dict,因为list.indexO(n)操作,您不希望为排序算法进行的每次比较执行此操作。

>>> keyorder = 'ID', 'GE','FN','LN','MN','EM', 'ST'
>>> keyorder = dict(zip(keyorder, range(len(keyorder))))
>>> 
>>> keyorder
{'FN': 2, 'GE': 1, 'ID': 0, 'LN': 3, 'ST': 6, 'EM': 5, 'MN': 4}

现在,您可以通过在每个字符串的:之前拆分部分进行排序,并从keyorder获得相应的优先级。

>>> data = ['ID:123 GE:m FN:Amir LN:Maleki EM:a@b.c MN:0400101010  ST:VIC']
>>> data = data[0].split()
>>> sorted(data, key=lambda x: keyorder[x.split(':', 1)[0]])
['ID:123', 'GE:m', 'FN:Amir', 'LN:Maleki', 'MN:0400101010', 'EM:a@b.c', 'ST:VIC']

(这里的前两行清理你的Data列表,因为它只是一个包含字符串的元素的列表。)

答案 1 :(得分:2)

您可以将sortedkey一起使用。它允许您指定任意lambda表达式来对数据进行排序:

key_order = ['ID', 'GE','FN','LN','MN','EM', 'ST']
data = ['ID:12,3', 'GE:m', 'FN:Amir', 'LN:Maleki', 'EM:a@b.c', 'MN:0400101010',  'ST:VIC']
print(sorted(data, key=lambda x: key_order.index(x.split(':')[0]))) 

这给出了输出:

['ID:12,3', 'GE:m', 'FN:Amir', 'LN:Maleki', 'MN:0400101010', 'EM:a@b.c', 'ST:VIC']

答案 2 :(得分:0)

尝试这样的事情:

  

一线方法:

new_list=[0]*len(d)
[new_list.__setitem__(i,"{}:{}".format(j,d.get(j))) for i,j in enumerate(keyorder) if j in d]

print(new_list)

输出:

['ID:123', 'GE:m', 'FN:Amir', 'LN:Maleki', 'MN:0400101010', 'EM:a@b.c', 'ST:VIC']
  

详细方法:

 d= {'ID':123, 'GE':'m', 'FN':'Amir', 'LN':'Maleki', 'MN':'0400101010', 'EM':'a@b.c', 'ST':'VIC'}

keyorder = ['ID', 'GE','FN','LN','MN','EM', 'ST']

new_list=[0]*len(d)

for i,j in enumerate(keyorder):
    if j in d:
        new_list[i]="{}:{}".format(j,d.get(j))

print(new_list)

输出:

['ID:123', 'GE:m', 'FN:Amir', 'LN:Maleki', 'MN:0400101010', 'EM:a@b.c', 'ST:VIC']