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

如何在python中自定义列表排序,python,python-3.x,list,sorting,dictionary,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', '

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

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')]
但是我可以不把清单写成口述就这样做吗?如果不行,我怎么把清单写成口述呢? 谢谢


您可以使用
键使用
排序的
。它允许您指定任意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']

首先,将您的
keyorder
设置为dict,因为
list.index
是一种
O(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']

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

尝试以下操作:

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')]
单线法:

输出:

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

输出:

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

你希望你的最终结果是什么样的?是一根绳子吗?名单?什么?你需要一些方法来映射哪个键对应什么值。这里的答案是这确实是一个列表,但他的第一条消息中的数据似乎是一个要解析的字符串。也许更好的方法是像
keyorder.get(x.split(':',1)[0],99999999)
?字符串中可能有顺序不重要的内容,因此…@Ev.Kounis更适合
float('inf')
float('-inf')
作为可能出现未知前缀的回退值。您好,这很好,但我需要这样显示--->ID:153 GE:m FN:John LN:Liu MN:0401810 EM:d@b.cST:NSW@SakiVandanaDisanayake您的名字是长字符串;)只是开玩笑,检查我的更新解决方案。如果您喜欢我的解决方案,请不要将其标记为已接受,而是使用它;)非常感谢你,我意识到我不需要把它放在字典里去订购。但是我必须显示最终结果如下ID:153 GE:m FN:John LN:Liu MN:0401810 EM:d@b.c新南威尔士州