• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Porównywanie zawartości dwóch plików i wypisywanie elementów wspólnych

Object Storage Arubacloud
0 głosów
970 wizyt
pytanie zadane 27 maja 2020 w Python przez Hubertius Bywalec (2,970 p.)

Hej

Mam do rozwiązania takie zadanko:

Zadanie 8 
Do swojego folderu w którym zapiszesz  powstały skrypt skopiuj dwa pliki .txt – „LiczbyPierwsze.txt” oraz „ZbiorLiczb2.txt”. Opracuj skrypt, który wyświetli  w shellu liczby powtarzające się w obu plikach. 

LiczbyPierwsze.txt

2
3
5
7
11
13
17
19
23
29 
31
37
41
43
47
53
59
61
67
71 
73
79
83
89
97
101
103
107
109
113 
127
131
137
139
149
151
157
163
167
173 
179
181
191
193
197
199
211
223
227
229 
233
239
241
251
257
263
269
271
277
281 
283
293
307
311
313
317
331
337
347
349 
353
359
367
373
379
383
389
397
401
409 
419
421
431
433
439
443
449
457
461
463 
467
479
487
491
499
503
509
521
523
541 
547
557
563
569
571
577
587
593
599
601 
607
613
617
619
631
641
643
647
653
659 
661
673
677
683
691
701
709
719
727
733 
739
743
751
757
761
769
773
787
797
809 
811
821
823
827
829
839
853
857
859
863 
877
881
883
887
907
911
919
929
937
941 
947
953
967
971
977
983
991
997

Zbiorliczb2.txt

1
7
10
13
19
23
28
31
32
44
49
68
70
79
82
86
91
94
97
100
103
109
129
130
133
139
167
176
188
190
192
193
203
208
219
226
230
236
239
262
263
280
291
293
301
302
310
313
319
320
326
329
331
338
356
362
365
367
368
376
379
383
386
391
392
397
404
409
440
446
464
469
478
487
490
496
536
556
563
565
566
608
617
622
623
632
635
637
638
644
649
653
655
656
665
671
673
680
683
694
700
709
716
736
739
748
761
763
784
790
793
802
806
818
820
833
836
847
860
863
874
881
888
899
901
904
907
910
912
913
921
923
931
932
937
940
946
964
970
973
989
998
1000

Zastanawiam się jak mogę to rozpisać. W języku C była choćby przydatna funkcja fscanf, która rozwiązałaby sprawę. Jednak nie słyszałem o funkcji w Pythonie wykonującej podobne działanie, dlatego zwracam się do was z zapytaniem jak to zrobić. Z góry dziękuję za wszelkie odpowiedzi.

 

2 odpowiedzi

+3 głosów
odpowiedź 28 maja 2020 przez mokrowski Mędrzec (155,460 p.)
wybrane 28 maja 2020 przez Hubertius
 
Najlepsza

Łatwo to zrobić przez przecięcie zbiorów. Nieco niechlujne:

def unique_numbers(filename1, filename2):
    map_file = lambda filename: set((value for value in open(filename)))
    return map_file(filename1) & map_file(filename2)

if __name__ == '__main__':
    print(unique_numbers("LiczbyPierwsze.txt", "ZbiorLiczb2.txt"))

Trochę bardziej zadbane, to przetworzenie na int:

def unique_numbers(filename1, filename2):
    map_file = lambda filename: set(map(int, (value for value in open(filename))))
    return map_file(filename1) & map_file(filename2)

if __name__ == '__main__':
    print(unique_numbers("LiczbyPierwsze.txt", "ZbiorLiczb2.txt"))

PS. Oczywiście nie sprawdzałem czy pliki są dostępne i czytelne. Także dla plików o ekstremalnej objętości, proponował bym inne rozwiązanie.

komentarz 28 maja 2020 przez Hubertius Bywalec (2,970 p.)
edycja 28 maja 2020 przez Hubertius

Okej, chyba działa. Jeżeli tylko mogę się spytać:

if __name__ == '__main__':

Co dokładnie oznacza warunek tej instrukcji warunkowej? I do czego służą te podkreślenia?

map(int, (value for value in open(filename))))

Co się dzieje w drugim argumencie funkcji map?

 return map_file(filename1) & map_file(filename2)

Co jest tutaj zwracane? I co tutaj powoduje operator koniunkcji bitowej?

 

1
komentarz 28 maja 2020 przez mokrowski Mędrzec (155,460 p.)
1. Tak się oznacza wejście do programu który może być używany w języku Python jako samodzielny i jako moduł. Ogólnie dobra praktyka.

2. W drugim argumencie funkcji map, pojawia się generator zwracający po kolei linia po linii zawartość pliku.

3. To oznaczenie przecięcia (ang. intersection) zbioru. Możesz nie używać tego ampersanda, tylko podać: map_file(filename1).intersection(map_file(filename2))
+1 głos
odpowiedź 27 maja 2020 przez niezalogowany

Można użyć operatora in. Treść plików zapisz do dwóch tablic. Iteruj po tablicach w ten sposób (jestem na telefonie i nie wstawię bloczku kodu):

for i in range(len(liczbypierwsze)):

        if liczbypierwsze[i] in zbiorliczb2: print(liczbypierwsze[i])

 

Podobne pytania

0 głosów
1 odpowiedź 185 wizyt
pytanie zadane 16 stycznia 2020 w Python przez tonn204 Mądrala (7,440 p.)
0 głosów
0 odpowiedzi 891 wizyt
pytanie zadane 29 sierpnia 2019 w Python przez Wiktor Michalski Początkujący (430 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...