我有一个基于键name
的值的排序列表,如下所示:
s = [{'name': 'Bart', 'age': 12}, {'name': 'Bart', 'age': 19}, {'name': 'Bart', 'age': 1},{'name': 'Homer', 'age': 30}, {'name': 'Homer', 'age': 12},{'name': 'Simpson', 'age': 19}]
我想安排列表中的元素,以便键name
具有相同值的词典不会一个接一个地出现。
必需的输出:
[{'name': 'Bart', 'age': 12}, {'name': 'Homer', 'age': 30}, {'name': 'Simpson', 'age': 19}, {'name': 'Bart', 'age': 19}, {'name': 'Homer', 'age': 12}, {'name': 'Bart', 'age': 1}]
或
[{'name': 'Bart', 'age': 12}, {'name': 'Homer', 'age': 30}, {'name': 'Bart', 'age': 19}, {'name': 'Homer', 'age': 12}, {'name': 'Bart', 'age': 1},{'name': 'Simpson', 'age': 19}]
要获得其中一项所需的输出,我尝试使用map
和lambda
我们的想法是将每个name
元素与下一个元素name
进行比较,如果它们不匹配,则交换值并返回结果列表。
以下是我正在尝试的代码:
map(lambda x: x if x['name']!=next(iter(x))['name'] else None, s)
有一点不起作用的是next(iter(x)
没有返回下一个元素。我还想知道为什么以及是否可以使用map
和lambda
来实现解决方案?
答案 0 :(得分:1)
我根据你的要求写了这个,虽然它不是那么简洁:
s = [{'name': 'Bart', 'age': 12}, {'name': 'Bart', 'age': 19}, {'name': 'Bart', 'age': 1},
{'name': 'Homer', 'age': 30}, {'name': 'Homer', 'age': 12},{'name': 'Simpson', 'age': 19}]
res=[]
for m,n in zip(s, reversed(s)):
if m!=n:
res.append(m)
res.append(n)
else:
res.append(m)
if len(res)==len(s):
break
print res
它利用了您已经拥有排序列表的事实。