我有一个对象列表,我想根据匹配的属性(id
)和可选的类参数“压缩”成一个更小的对象列表。在
class Case:
def __init__(self, id, formtype, age, fever=None, cough=None, gender=None):
self.case_id = case_id
self.form_type = formtype
self.age = age
self.fever = fever
self.cough = cough
self.gender = gender
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")
]
我怎么才能得到这样的新名单?它应该选择formtype="B"
而不是formtype="A"
。在
我试着用dict压缩它,但没有成功:
compressed = [Case(id=case.id, formtype=None, age=case.age) for event in caselist if case.formtype == 'A']
有时,我认为琐碎的显式方法也是最好的方法,我会简单地采用以下方法:
它与输入一起给出输出(在为Case类定义了
^{pr2}$__str__
函数之后):注意,对于ID75321,它的咳嗽参数是
None
而不是0,我认为这是更好的,因为您没有关于该id的咳嗽参数的任何信息(同样对于ID12345,正确的咳嗽参数是0,而不是1。我想这是您的示例输出中的错误)它还只迭代原始的
caselist
一次,并使用字典进行O(1)id查找这是一个相当长的一个比你要去的地方,但这个工作。它创建
A
表单和B
表单的单独列表。然后在B
窗体上循环,并查找匹配的A
窗体。如果它找到一个匹配项,那么它会将所有A
值添加到B
表单中这是另一种方法,它比我以前的答案更有效,但不如@LeartS的答案有效。这两个答案都可以处理不同的表单布局
^{pr2}$按id分组,并将具有“B”form_类型的对象保留为具有“B”formtype的重复id的对象,否则保持原样,如果要使用“B”中未设置的任何属性,可以使用getattr和setattr迭代属性,以设置B中以前未设置的任何属性,除非事先知道A中设置了什么和/或B中设置了什么,否则不能硬编码设置什么或不设置什么:
相关问题 更多 >
编程相关推荐