Wyciąganie cyfr z ciągu tekstowego

Wyciąganie cyfr z ciągu tekstowego
S4
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:37
0

WItam. Znalazłem zadanie, długi plik, wydaje się zapisany za pomocą JSON-a. Zadanie polega na wyciągnięciu z całego pliku cyfr i zsumowanie ich. Można jakąś pętlą/funkcją wyciągnąć cyfry. No i jeśli jest napisany w JSON to czy muszę użyć konsoli JavaScript, czy w Pythonie da radę?

Guaz
Tak dla pewności: cyfr czy liczb? Różnica jest taka że np. przy start111sep111stop suma cyfr to 6, suma liczb to 222. Upewniam się tylko z tego względu że ludzie to mylą, nie jest to nic osobistego, po prostu wynik będzie nieprawidłowy dla rozwiązań kolegów niżej jeśli chodziło o liczby.
W rozwiązaniu opartym na grep wystarczy zamienić \d na \d+. :>
JA
  • Rejestracja:prawie 15 lat
  • Ostatnio:15 dni
1

sum(int(ch) for ch in json if ch.isdigit())

edytowany 1x, ostatnio: jackweb
JA
Oczywiście zmienna json musi być stringiem reprezentującym JSONa. ;-)
S4
To znaczy? Pierwszy raz się z czymś taki spotykam
JA
Ta składnia mówi, że interujemy po wszystkich znakach JSONa (for ch in json) i zamieniamy je na liczbę int(ch). Pod warunkiem, że dany znak reprezentuje cyfrę if ch.isdigit(). Wszystkie cyfry trafiają do funkcji sum, która je sumuje.
JA
Można szukać czegoś podobnego pod nazwą list comprehension.
S4
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:37
0

import json
json = json.dumps(ciąg tekstowy)
x=[]
x.append(sum(int(ch) for ch in json if ch.isdigit()))
print(x)
wyskoczyła mi liczba. ten zapis jest ok?

JA
  • Rejestracja:prawie 15 lat
  • Ostatnio:15 dni
0

Nie rozumiem, po co Ci zmienna x (jako lista).

S4
A tak jakoś z nawyku
  • Rejestracja:około 6 lat
  • Ostatnio:ponad rok
1

Lepsze podejście:

Kopiuj
> grep -P -o '\d' big10.txt | awk '{ sum += $0 }; END { print 0 + sum }'
1031770
> grep -P -o '\d' big10.txt | datamash sum 1
1031770
> 
Kopiuj
> time -f %e python3 -c 'import sys; print(sum(int(ch) for ln in sys.stdin for ch in ln if ch.isdigit()))' <big10.txt
1031770
5.79
> time -f %e bash -c 'grep -P -o "\d" | awk "{ sum += \$0 }; END { print 0 + sum }"' <big10.txt
1031770
0.36
> time -f %e bash -c 'grep -P -o "\d" | datamash sum 1' <big10.txt
1031770
0.33
> 
edytowany 3x, ostatnio: Mózg

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.