Usuwanie duplikatów

Usuwanie duplikatów
P7
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0

Witam.
Mam pytanie. Potrzebuję napisać aplikację usuwającą duplikaty z pliku po porównaniu go z drugim plikiem. Plik "A" to baza numerów np. PESEL a plik "B" to baza z numerami do porównania. Z bazy "B" muszę usunąć numery znajdujące się już w bazie "A" i po usunięciu dopisać nowe do bazy "A". Zaczynam dopiero programować w Pythonie i nie bardzo wiem jak się za to zabrać :)
Ma ktoś jakiś pomysł na efektywny program (baza będzie rosła i będzie miała dużą liczbę numerów).

AN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 988
0

Rozumiem, że ta baza to konkretnie muszą być pliki tekstowe i w każdej linii masz numer PESEL tak?

P7
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0
anonimowy napisał(a):

Rozumiem, że ta baza to konkretnie muszą być pliki tekstowe i w każdej linii masz numer PESEL tak?

Dokładnie tak

DB
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 227
0
  1. najpierw stworz plikA i plikB - mozliwosci jest wiele w zaleznosci o ilosc i tego jak te dane maja wygladac
    np; json, xml , yaml, baza danych, csv, jsonlines , txt, ini czy cokolwiek innego.

  2. stworz "program" ktory wczytuje zawartosc plikow A i B do jakichs struktur danych wszystko zaleznie jaka beda mialy strukture danych te twoje dane w plikach.

Potem sobie mozesz porownywac to co masz na milion sposobow.

P7
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0

Jest pewne, że pliki będą csv ewentualnie txt. A jeśli chodzi o tą strukturę to co wykorzystać najlepiej, bo ten PlikA czyli baza będzie miał w przyszłości ponad 100 tys rekordów.

KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2518
0

Generalnie w każdym języku robisz to mniej więcej tak samo. Otwierasz plik A, wrzucasz wszystko do czegoś w stylu HashSet (jakkolwiek to się nazywa w danym języku), i potem czytasz czytasz drugi plik, wywalasz wszystko co jest w secie (w pseudokodzie cos w stylu: ret = []; foreach (el in B) if !A.contains(el) ret.push(el)). Nie rozumiem po co później je dopisywać do A skoro A już je zawiera.

P7
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0

Źle napisałem. Mają być dopisane te których nie ma, aby baza zawierała nowych Klientów.

KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2518
0

@pajzano78: jak użyjesz HashSet (odpowiednika w pythonie) to wystarczy dodać, nie da się dodać duplikatów do HashSeta (zgodnie z ustaloną funkcją hashującą i testującą, która dla stringów z reguły działa zgodnie z oczekiwaniami w każdym języku)

P7
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7
0

Ok. Zobaczymy co z tego wyjdzie bo nie znam za bardzo Pythona ale wiem że jest to język do takich działań. Poczytam o Hashset i mam nadzieje, że uda się stworzyć optymalny kod.

DB
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 227
0

W pythonie sa sety tj: 'set'. Poczytaj w dokumentacji jak to dziala i jakie metody sa wbudowane.
Te sety to tak naprawde zbiory wiec musisz dobrac odpowiednie operacje na zbiorach zeby wyselekcjonowac to co chcesz.

Wszystko masz w dokumentacji tu sa linki:
https://docs.python.org/2/library/sets.html
https://docs.python.org/3.6/library/stdtypes.html?highlight=set#set

P2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 47
0

Najszybciej będzie do siebie dodać dwie listy do siebie, i następnie zrobić z niej set (w skrócie lista bez powtórzeń) koniec.

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5023
0

Tak mi się to widzi:

Kopiuj
def rem_duplicates(xs, ys):
    ys = set(ys)
    for elem in xs:
        if elem in ys:
            ys.remove(elem)
    return xs + list(ys)

Jak już Będziesz miał w listach xs i ys otwarte pliki, złożoność powinna być liniowa.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.