将列表中的多个项移动到索引中



我有一个包含字典的列表,它看起来像这样:

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']}]

相关内容

  • 没有找到相关文章

最新更新