您的代码假定名称是唯一的,我们可以利用这一点:
class human:
def __init__(self, name, age=0, height=0):
self.name = name
self.age = age
self.height = height
def merge(self, other):
if not self.age:
self.age = other.age
if not self.height:
self.height = other.height
def __repr__(self):
return 'human(name={}, age={}, height={})'.format(self.name, self.age, self.height)
def merge_lists(list_1, list_2):
output = {h.name: h for h in list_1}
for h in list_2:
try:
output[h.name].merge(h)
except KeyError:
output[h.name] = h
return list(output.values())
list_1 = [human("Alice", age=25), human("Bob", age=30), human("Steve", age=21)]
list_2 = [human("Alice", height=170), human("Bob", height=185)]
print(merge_lists(list_1, list_2))
输出
[human(name=Alice, age=25, height=170),
human(name=Bob, age=30, height=185),
human(name=Steve, age=21, height=0)]
如果我们实现 HumanList 类,这可以更进一步:
from collections import UserList
from copy import deepcopy
class human:
def __init__(self, name, age=0, height=0):
self.name = name
self.age = age
self.height = height
def merge(self, other):
if not self.age:
self.age = other.age
if not self.height:
self.height = other.height
def __repr__(self):
return 'human(name={}, age={}, height={})'.format(self.name, self.age, self.height)
class HumanList(UserList):
def merge_lists(self, other_list):
output = {h.name: deepcopy(h) for h in self}
for h in other_list:
try:
output[h.name].merge(h)
except KeyError:
output[h.name] = h
return HumanList(output.values())
list_1 = HumanList([human("Alice", age=25), human("Bob", age=30), human("Steve", age=21)])
list_2 = HumanList([human("Alice", height=170), human("Bob", height=185)])
merged_list = list_1.merge_lists(list_2)
print(merged_list)
输出
[human(name=Alice, age=25, height=170),
human(name=Bob, age=30, height=185),
human(name=Steve, age=21, height=0)]