繁体   English   中英

如何从具有两个匹配对象属性的两个列表中进行选择?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM