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ł
0
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.
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.
2
To jak to się ładnie mieści w pamięci, to Możesz zrobić tak:
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.
0
Dzięki. Twojego skryptu brakowało. dorzuciłem pętle
x = 0
for elem in data:
if len(elem) == len(set(elem)):
x += 1
print(x)
i policzyło.
0
Możesz napisać ten program dużo lepiej:
> 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:
> 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
...
>