Wykrywanie duplikatów w pliku TXT

Wykrywanie duplikatów w pliku TXT
S4
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:37
0

Witam. Mam plik .txt zawiera kilkaset linii nic nie znaczących słów, i muszę policzyć te linie które nie zawierają duplikatów. Na początku myślałem o wpisywanie je w linie, i porównywanie ich z tą samą zmienną przekształconą w set. Ale to kilka godzin pracy a według zadania można to zrobić w miarę szybko. Jest jakiś sposób by Python znalazł te linie i policzył

lion137
  • Rejestracja:ponad 8 lat
  • Ostatnio:2 minuty
  • Postów:4946
0

Czemu kilka godzin? Dla każdej linii, Wrzucasz każdy wyraz do zbioru i jak do końca nie będzie duplikatu, to Inkrementujesz licznik i Przechodzisz do następnej. Złożoność będzie O(n), gdzie n to liczba wyrazów.


S4
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:37
0

A nie wymagało by to refaktoryzacji linii? Trzeba każde słowo oznaczyć cudzysłowami inaczej python nie będzie tego obsługiwać. Trzeba by kopiować, refaktoryzować, sprawdzać, i od nowa.

lion137
Linie będą zczytane, jako string. Jak wyglądaja te dane?
S4
ania anna kasia agaa piort jacek gacek wacek i tak kilkaset linijek
lion137
  • Rejestracja:ponad 8 lat
  • Ostatnio:2 minuty
  • Postów:4946
2

To jak to się ładnie mieści w pamięci, to Możesz zrobić tak:

Kopiuj
with open('data.txt') as f:
	data = [x.split() for x in f]

print(data)

Teraz Masz te linie, jako listę list wyrazów, stringów.


edytowany 1x, ostatnio: lion137
S4
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:37
0

Dzięki. Twojego skryptu brakowało. dorzuciłem pętle

Kopiuj
x = 0
for elem in data:

    if len(elem) == len(set(elem)):
        x += 1
print(x)

i policzyło.

lion137
Proszę, to Odznacz jakąś odpowiedź, żeby inni widzieli, że rozwiązanie działa.
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad rok
0

Możesz napisać ten program dużo lepiej:

Kopiuj
> time python3 szopen.py
923800
5.58user 0.40system 0:06.00elapsed 99%CPU (0avgtext+0avgdata 852240maxresident)k
...
> time python3 mozg.py <big10.txt
923800
4.85user 0.02system 0:04.89elapsed 99%CPU (0avgtext+0avgdata 6652maxresident)k
...
> 

I tradycyjnie, jedna linia AWK:

Kopiuj
> time awk '{ delete a; for (i = 1; i <= NF; ++i) if (a[$i]++) next; ++c }; END { print 0 + c }' <big10.txt
923800
1.94user 0.02system 0:01.97elapsed 99%CPU (0avgtext+0avgdata 944maxresident)k
...
> 
edytowany 1x, ostatnio: Mózg
S4
Szczerze to zielonego pojęcia nie mam co ten skrypt ma zdziałać.
Guaz
Dokładnie to samo, tylko szybciej ;P
S4
Zasadniczo przetworzenia tego co mam trwa sekundę. Przy BigData może ma to znaczenie. Ja wątpię żebym zobaczył różnice, a szczerze nie rozumiem z tego skryptu nic
Takie zadania dostaje się na screeningach i na rozgrzewkę podczas interviews. Albo zaczniesz myśleć, albo u szczytu kariery będziesz pracować w czwartoligowcu zarabiając niewiele ponad średnią krajową. Unikaj wczytywania całych plików do pamięci. Unikaj wpisywania nazw plików na sztywno. Unikaj śmieciowych nazw jak data, jeżeli wiesz czym dane są – w przypadku Twojego programu są to rekordy i pola/linie i słowa. len(xs) == len(set(xs)) nie jest optymalnym rozwiązaniem.
S4
Programowaniem zajmuje się ja wiem. Pół roku. Ja na serio nie rozumiem co tam jest napisane. Ja wiem że moje rozwiązanie nie jest optymalne. Ale dla większych ilości danych. W przypadku małego pliku jedynie 500linii nie sprawia to problemu. KISS. Sprawdza się.

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.