Usuwanie duplikatów

Usuwanie duplikatów
P7
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 6 lat
  • 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).

edytowany 1x, ostatnio: pajzano78
AN
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 7 godzin
  • Postów:973
0

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


Zdalna praca dla Senior Python Developerów --> PW
P7
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 6 lat
  • 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:ponad 9 lat
  • Ostatnio:4 miesiące
  • 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.

edytowany 1x, ostatnio: DolBo
P7
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 6 lat
  • 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:prawie 16 lat
  • Ostatnio:6 miesięcy
  • Postów:2514
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.


░█░█░█░█░█░█░█░█░█░█░█░
edytowany 1x, ostatnio: krwq
P7
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 6 lat
  • Postów:7
0

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

KR
  • Rejestracja:prawie 16 lat
  • Ostatnio:6 miesięcy
  • Postów:2514
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)


░█░█░█░█░█░█░█░█░█░█░█░
edytowany 1x, ostatnio: krwq
P7
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 6 lat
  • 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:ponad 9 lat
  • Ostatnio:4 miesiące
  • 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

edytowany 1x, ostatnio: DolBo
P2
  • Rejestracja:ponad 9 lat
  • Ostatnio:prawie 4 lata
  • 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.

Zobacz pozostałe 2 komentarze
enedil
Gdyż nie da się z takiej reprezentacji wyciągnąć elementów, które mają pozostać w bazie B.
P2
list_b = [item for item in list_b if item not in list_a]
enedil
Gratuluję kwadratowej złożoności
P2
list_b = list(set(list_b) - set(list_a))
P2
jest mnóstwo sposobów na zapis tego.
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:minuta
  • Postów:4924
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.


edytowany 1x, ostatnio: lion137

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.