Python的dicts列表 - 在列表中找到最接近4个条目的新条目

时间:2018-04-30 19:00:24

标签: python

我有一个词典列表:

members = [ 
{'name': 'Fred', 'age': 22}, 
{'name': 'John', 'age': 25},
{'name': 'Adamn', 'age': 33},
{'name': 'Lily', 'age': 17},
{'name': 'Susy', 'age': 19},
{'name': 'Frank', 'age': 42},
{'name': 'Adam', 'age': 38},
{'name': 'Jose', 'age': 18}, 
{'name': 'Mikey', 'age': 14},
{'name': 'Shelby', 'age': 27} 
]

然后我有一个新成员加入,我想将他们与4个人配对,是年龄最接近的成员。

new_member = {'name': 'Rob', 'age': 23}

这将归来弗雷德(22),约翰(25),苏西(19),谢尔比(27),因为他们是最接近罗布的年龄。我的方法似乎是返回一个无限循环而不是正确的结果。我也有一种感觉,有一种更优雅的方式来解决这个问题,我希望能够理解/学习。但这是我到目前为止所做的:

new_list = sorted(members, key=lambda k: k['age']) 
for row in newlist:
  diff = row['age'] - new_member['age']
  row.update({'diff':diff})

closest = []

for i, mem in enumerate(newlist):
  if i == 0:
    closest.insert(0, mem)
  elif i > 0:
    for row in closest:
      if row['diff'] < mem['diff']:
        closest.insert(0, mem)

1 个答案:

答案 0 :(得分:2)

为什么不在年龄中按差异排序?

closest = sorted(
    members, key=lambda x: abs(x['age'] - new_member['age'])
)[:4]

差异较小=&gt;他们的年龄越来越近了。

print(closest)
[{'age': 22, 'name': 'Fred'},
 {'age': 25, 'name': 'John'},
 {'age': 19, 'name': 'Susy'},
 {'age': 27, 'name': 'Shelby'}
]

请注意,您要将原始记录对象分配给closest,因此如果您最终修改这些对象,members也会反映这些变化。您可以事先为该案例添加copy来电:from copy import deepcopy; closest = deepcopy(....)