我有一个包含字典的列表,它看起来像这样:
testList = [{'title': 'test1', 'path': ['a', 'b']},
{'title': 'test2', 'path': ['a', 'b']},
{'title': 'test3', 'path': ['a', 'e']},
{'title': 'test4', 'path': ['a', 'e']},
{'title': 'test5', 'path': ['a', 'z']},
{'title': 'test6', 'path': ['a', 'z']}]
我想移动每一个字典,把path[-1] == "z"
放在test2
前面。我试图使它,所以我的程序能够找到列表中最后一个元素的索引与path[-1] == "b"
,并将其添加到前面。
预期输出:
[{'title': 'test1', 'path': ['a', 'b']},
{'title': 'test2', 'path': ['a', 'b']},
{'title': 'test5', 'path': ['a', 'z']},
{'title': 'test6', 'path': ['a', 'z']},
{'title': 'test3', 'path': ['a', 'e']},
{'title': 'test4', 'path': ['a', 'e']}]
我试过这样做:
for d in testList:
if d['path'][-1] == "b":
idx = testList.index(d)
if d['path'][-1] == "z":
testList.remove(d)
testList.insert(idx, d)
但是这不起作用,它根本没有改变列表。有没有人可以提供一些帮助。
正如注释所示,在迭代列表时更改列表的元素,在我看来,您只是在排序。首先是b
,然后是z
,然后是其他的。
如果我们像这样创建一个排序键:
sortkey = {'b' : 0 , 'z' : 1}
,并像这样使用:
testList = sorted(testList, key = lambda x: sortkey.get(x['path'][-1],2))
testlist现在是:
[{'title': 'test1', 'path': ['a', 'b']},
{'title': 'test2', 'path': ['a', 'b']},
{'title': 'test5', 'path': ['a', 'z']},
{'title': 'test6', 'path': ['a', 'z']},
{'title': 'test3', 'path': ['a', 'e']},
{'title': 'test4', 'path': ['a', 'e']}]
如果我猜对了你想要实现的目标,你可以设置一个自定义排序顺序
order= ['b','z']
sortedList = sorted(testList, key=lambda x: order.index(x['path'][-1]) if x['path'][-1] in order else len(order))
试试这个
testList = [{'title': 'test1', 'path': ['a', 'b']},
{'title': 'test2', 'path': ['a', 'b']},
{'title': 'test3', 'path': ['a', 'e']},
{'title': 'test4', 'path': ['a', 'e']},
{'title': 'test5', 'path': ['a', 'z']},
{'title': 'test6', 'path': ['a', 'z']}]
index = [i for i,v in enumerate(testList) if v['title'] == 'test2'][-1]+1 # find the index of dict with the title of test2 and add 1.
new_lst = []
for a in testList:
if a['path'][-1] == 'z':
new_lst.insert(index,a)
index+=1
continue
new_lst.append(a)
print(new_lst)
查找列表中最后一个值为'b'的字典。创建一个由元素组成的新列表,直到并包括先前找到的元素。随后插入或追加到新列表。
这里没有排序,因为对'z'的检查被认为是任意的。
testList = [{'title': 'test1', 'path': ['a', 'b']},
{'title': 'test2', 'path': ['a', 'b']},
{'title': 'test3', 'path': ['a', 'e']},
{'title': 'test4', 'path': ['a', 'e']},
{'title': 'test5', 'path': ['a', 'z']},
{'title': 'test6', 'path': ['a', 'z']}]
idx = -1
for i, d in enumerate(testList):
if d['path'][-1] == 'b':
idx = i
if (idx := idx+1) > 0:
newList = testList[:idx]
for d in testList[idx:]:
if d['path'][-1] == 'z':
newList.insert(idx, d)
idx += 1
else:
newList.append(d)
print(newList)
输出:
[{'title': 'test1', 'path': ['a', 'b']}, {'title': 'test2', 'path': ['a', 'b']}, {'title': 'test5', 'path': ['a', 'z']}, {'title': 'test6', 'path': ['a', 'z']}, {'title': 'test3', 'path': ['a', 'e']}, {'title': 'test4', 'path': ['a', 'e']}]