如何在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新南威尔士州