首页 > 解决方案 > Python 字典列表 - 在列表中找到最接近新条目的 4 个条目

问题描述

我有一个字典列表:

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}

这将选出 Fred (22)、John (25)、Susy (19)、Shelby (27),因为他们的年龄与 Rob 最接近。我的方法似乎是返回一个无限循环而不是正确的结果。我也有一种感觉,有一种更优雅的方式来解决这个问题,我希望能够理解/学习。但这就是我到目前为止所拥有的:

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)

标签: python

解决方案


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

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

差异越小=>他们的年龄越接近。

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(....)


推荐阅读