Duplikate filtern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mechanicalStore
User
Beiträge: 172
Registriert: Dienstag 29. Dezember 2009, 00:09

Wie kann ich hier am sinnvollsten / einfachsten doppelte Einträge verhindern, ohne den 'konventionellen' Weg, alles einzeln zu prüfen. Also dass für

Code: Alles auswählen

('foo', 'bar', 'baz')
nicht zwei Instanzen in der Liste landen:

Code: Alles auswählen

#!/usr/bin/env python

class A:
    def __init__(self, b, c, d):
        self.b = b
        self.c = c
        self.d = d

def create(data) -> list:
    components = []
    for n in data:
        a = A(*n)
        components.append(a)
    return components
    

def main():

    data = [
        ('foo', 'bar', 'baz'),
        ('other foo', 'other bar', 'other baz'),
        ('foo', 'bar', 'baz'),
        ('another foo', 'another bar', 'another baz')
    ]

    result = create(data)
    
    
if __name__ == '__main__':
    main()
Geht da ggf. was mit einem set und lambda?
Benutzeravatar
sparrow
User
Beiträge: 4522
Registriert: Freitag 17. April 2009, 10:28

Nimm keine Liste sondern ein Set.
mechanicalStore
User
Beiträge: 172
Registriert: Dienstag 29. Dezember 2009, 00:09

sparrow hat geschrieben: Samstag 17. Mai 2025, 18:18 Nimm keine Liste sondern ein Set.
Ändert aber nichts. Objekt-Instanzen sind ja auch unterschiedlich, auch wenn die Instanzvariablen gleich sind:

Code: Alles auswählen

def create(data) -> set:
    components = set()
    for n in data:
        a = A(*n)
        components.add(a)
    return components
Gleiches Ergebnis.
Sirius3
User
Beiträge: 18245
Registriert: Sonntag 21. Oktober 2012, 17:20

Deshalb brauchst Du eine Klasse, die hash unterstützt.

Code: Alles auswählen

from dataclasses import dataclass
from itertools import starmap

@dataclass(frozen=True)
class A:
    b:str
    c:str
    d:str

def create(items):
    return set(starmap(A, items))
narpfel
User
Beiträge: 690
Registriert: Freitag 20. Oktober 2017, 16:10

@mechanicalStore: Du musst das Hashable-Protocol richtig implementieren, damit die Instanzen sinnvoll in einem `set` benutzt werden können. Oder du benutzt etwas, das das automatisiert, z. B. ein `namedtuple` oder `attrs` mit `frozen=True`.
mechanicalStore
User
Beiträge: 172
Registriert: Dienstag 29. Dezember 2009, 00:09

Oh, da habe ich wohl eine Bildungslücke, da bisher nichts mit dataclasses zu tun gehabt.

Besten Dank für die Antworten. Funktioniert einwandfrei!
Antworten