如何解决如何从具有两个匹配对象属性的两个列表中进行选择? 输出:
我有两个对象列表,我需要选择具有相同属性 cpf 和值的项目:
这是我的对象类:
class Clientes:
def __init__(self):
self.nome = ""
self.cpf = ""
self.valor = ""
self.proposta = ""
这是我的主要代码:
from objetos import Clientes
ArquivoA = {'Cliente1': ['Antonio','123','150','a'],'Cliente2': ['Betina','456','200','b'],'Cliente3': ['Dagmar','789','300','c'],'Cliente4': ['Richard','001','400','d'],'Cliente5': ['Maria','435','80','e']}
ArquivoB = {'Cliente1': ['Antonio','150'],'200'],'250'],'450'],'Cliente5': ['Jose','987','500']}
listaA= []
listaB = []
for item in ArquivoA:
c = Clientes()
c.nome = ArquivoA[item][0]
c.CPF = ArquivoA[item][1]
c.valor = ArquivoA[item][2]
c.proposta = ArquivoA[item][3]
listaA.append(c)
print(listaA)
for item in ArquivoB:
b = Clientes()
b.nome = ArquivoB[item][0]
b.CPF = ArquivoB[item][1]
b.valor = ArquivoB[item][2]
listaB.append(c)
print(listaB)
我想创建一个新列表,其中 c.CPF == b.CPF 和 c.value == b.value。我不想为此使用双循环,因为我的真实列表太大了。
解决方法
assert len(ArquivoA) == len(ArquivoB)
equal_value = []
for (a,b) in zip(ArquivoA,ArquivoB):
if a.CPF == b.CPF:
equal_value.append(a)
zip
将两个列表转换为一个以元组为元素的列表。
使用 dict comprehensions 根据您感兴趣的属性构建词典。 使用 set intersections 查找公共键。 现在去获取存储在查找字典中的值。
ArquivoA = {'Cliente1': ['Antonio','123','150','a'],'Cliente2': ['Betina','456','200','b'],'Cliente3': ['Dagmar','789','300','c'],'Cliente4': ['Richard','001','400','d'],'Cliente5': ['Maria','435','80','e']}
ArquivoB = {'Cliente1': ['Antonio','150'],'200'],'250'],'450'],'Cliente5': ['Jose','987','500']}
class Clientes:
def __init__(self,nome,CPF,valor,proposta=None):
self.nome = nome
self.CPF = CPF
self.valor = valor
self.proposta = proposta
def __repr__(self) -> str:
return f"{self.__dict__}"
list_a = [Clientes(v[0],v[1],v[2],v[3]) for v in ArquivoA.values()]
list_b = [Clientes(v[0],v[2]) for v in ArquivoB.values()]
#build a lookup dictionary by CPF,valor
di_a = {(c.CPF,c.valor) : c for c in list_a}
di_b = {(c.CPF,c.valor) : c for c in list_b}
#use sets to find common keys
set_a = set(di_a.keys())
set_b = set(di_b.keys())
common = set_a & set_b
#compare or do something else with the matching instances
for key in common:
va = di_a[key]
vb = di_b[key]
print(f"\n\n{key}:\n {va=}\n {vb=}" )
输出:
('123','150'):
va={'nome': 'Antonio','CPF': '123','valor': '150','proposta': 'a'}
vb={'nome': 'Antonio','proposta': None}
('456','200'):
va={'nome': 'Betina','CPF': '456','valor': '200','proposta': 'b'}
vb={'nome': 'Betina','proposta': None}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。