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

标签 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')]

但是我可以在不将列表变成字典的情况下执行此操作吗?如果不是,我如何将列表变成字典? 谢谢你!!

最佳答案

首先,让你的 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/

相关文章:

python - 如何用python去除元组列表?

python - numdisplay ds9 在 Debian Linux 上崩溃

c# - 在 C# 2.0 中同步两个 IList 的最佳算法

python - 使用 np.einsum 进行光线转换的矢量化范围

python-3.x - 无法使用Gstreamer-Python设置两个摄像机的参数

python - 尽管有 "if statement",但重复项最终出现在列表中

python - 在 Mac 上使用 Docker 使用 Py2exe

python - 计算 python 中的二维列表

python - RuntimeWarning : DateTimeField Model. 当时区支持处于事件状态时,日期收到了幼稚的日期时间

python - 如何从字符串(Wireshark 输出)中提取某些子字符串(IP 地址)?