我有一个词典列表:
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)
答案 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(....)