Seite 1 von 1

Duplikate filtern

Verfasst: Samstag 17. Mai 2025, 18:15
von mechanicalStore
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?

Re: Duplikate filtern

Verfasst: Samstag 17. Mai 2025, 18:18
von sparrow
Nimm keine Liste sondern ein Set.

Re: Duplikate filtern

Verfasst: Samstag 17. Mai 2025, 18:23
von mechanicalStore
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.

Re: Duplikate filtern

Verfasst: Samstag 17. Mai 2025, 18:29
von Sirius3
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))

Re: Duplikate filtern

Verfasst: Samstag 17. Mai 2025, 18:32
von narpfel
@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`.

Re: Duplikate filtern

Verfasst: Samstag 17. Mai 2025, 18:45
von mechanicalStore
Oh, da habe ich wohl eine Bildungslücke, da bisher nichts mit dataclasses zu tun gehabt.

Besten Dank für die Antworten. Funktioniert einwandfrei!