[英]How to select from two lists with two matching object atributes?
我有两个对象列表,我需要选择具有相同属性 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', '123', '150'],
'Cliente2': ['Betina', '456', '200'],
'Cliente3': ['Dagmar', '789', '250'],
'Cliente4': ['Richard', '001', '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。 我不想为此使用双循环,因为我的真实列表太大了。
使用dict comprehensions根据您感兴趣的属性构建词典。 使用集合交集查找公共键。 现在去获取存储在查找字典中的值。
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', '123', '150'],
'Cliente2': ['Betina', '456', '200'],
'Cliente3': ['Dagmar', '789', '250'],
'Cliente4': ['Richard', '001', '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[1], 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', 'CPF': '123', 'valor': '150', 'proposta': None}
('456', '200'):
va={'nome': 'Betina', 'CPF': '456', 'valor': '200', 'proposta': 'b'}
vb={'nome': 'Betina', 'CPF': '456', 'valor': '200', 'proposta': None}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.