我有一个标有数据的列表,我想按以下方式订购:
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')]
但是我可以在不将列表变成字典的情况下这样做。如果不是我怎么把列表变成一个字典? 谢谢!!
答案 0 :(得分:3)
首先,将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']
(这里的前两行清理你的Data
列表,因为它只是一个包含字符串的元素的列表。)
答案 1 :(得分:2)
您可以将sorted
与key
一起使用。它允许您指定任意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']