生成没有相邻字典键/值相等的字典列表

时间:2016-07-22 11:12:28

标签: python lambda

我有一个基于键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}]

要获得其中一项所需的输出,我尝试使用maplambda 我们的想法是将每个name元素与下一个元素name进行比较,如果它们不匹配,则交换值并返回结果列表。

以下是我正在尝试的代码:

map(lambda x: x if x['name']!=next(iter(x))['name'] else None, s)

有一点不起作用的是next(iter(x)没有返回下一个元素。我还想知道为什么以及是否可以使用maplambda来实现解决方案?

1 个答案:

答案 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

它利用了您已经拥有排序列表的事实。