我有一个标记为数据的列表,我想按以下方式对其进行排序:
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')]
但是我可以在不将列表变成字典的情况下执行此操作吗?如果不是,我如何将列表变成字典? 谢谢你!!
最佳答案
首先,让你的 keyorder
成为一个字典,因为 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']
(此处的前两行清理了您的 Data
列表,因为它只是包含一个字符串的一个元素的列表。)
关于python - 如何在python中自定义排序列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48282388/