<p>按id分组,并将具有“B”form_类型的对象保留为具有“B”formtype的重复id的对象,否则保持原样,如果要使用“B”中未设置的任何属性,可以使用getattr和setattr迭代属性,以设置B中以前未设置的任何属性,除非事先知道A中设置了什么和/或B中设置了什么,否则不能硬编码设置什么或不设置什么:</p>
<pre><code>class Case:
def __init__(self, id, formtype, age, fever=None, cough=None, gender=None):
self.case_id = id
self.form_type = formtype
self.age = age
self.fever = fever
self.cough = cough
self.gender = gender
def __iter__(self):
for ele in ["case_id", "form_type", "age",
"fever", "cough", "gender"]:
yield ele
caselist = [
Case(id="12345", formtype="A", age=12, fever=1, gender="female"),
Case(id="12345", formtype="B", age=12, cough=0),
Case(id="67890", formtype="A", age=34, fever=0, gender="male"),
Case(id="67890", formtype="B", age=34, cough=1),
Case(id="75321", formtype="A", age=2, fever=0, gender="male")
]
d = {}
for c in caselist:
if c.case_id not in d:
d[c.case_id] = c
elif d[c.case_id].form_type != "B" and c.form_type == "B":
tmp = d[c.case_id]
for attr in c:
if getattr(c, attr) is None:
setattr(c, attr, getattr(tmp, attr))
d[c.case_id] = c
caselist[:] = d.values()
print(caselist)
</code></pre>