微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我有两个对象列表,我需要选择具有相同属性 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 举报,一经查实,本站将立刻删除。