2016-09-08 1 views
1

Hallo dort Stack Overflow!Finden Sie das letzte Element (Ziffer) in jeder Zeile und summe alle, die gerade Python sind 3

Ich versuche eine Aufgabe zu lösen, die wir heute in meiner Python-Klasse bekommen haben. Ich bin mit Python noch nicht sehr vertraut, also könnte ich wirklich ein paar Tipps brauchen.

Die Aufgabe ist: Finden Sie das letzte Element (Ziffer) in jeder Zeile, wenn es welche gibt, und summieren Sie alle , die gerade sind. so etwas tun

Ich habe begonnen:

result = 0 
counter = 0 
handle = open('httpd-access.txt') 
for line in handle: 
    line = line.strip() 
    #print (line) 
    if line[:-1].isdigit(): 
     print(line[:-1].isdigit()) 
     digitFirst = int(line[counter].isdigit()) 
     if digitFirst % 2 == 0: 
      print("second") 
      result += digitFirst 
    else: 
     print("else") 


    ANSWER = result 

Aber dieser Code funktioniert nicht für mich, ich habe keine Daten in Folge erhalten. Was fehlt mir? Ein Problem ist, dass ich nicht Zeile für Zeile durch die Zeile gehe, sondern nur die ganze Zeile. Hier

ist ein Beispiel dafür, wie ich in der Datei Zeile aussehen:

37.58.100.166--[02/Jul/2014:16:29:23 +0200]"GET/kod-exempel/source.php?dir=codeigniter/user_guide_src/source/_themes/eldocs/static/asset HTTP/1.1"200867 

Also das, was ich abrufen möchten die 7. und dann möchte ich einen Scheck tun, wenn die sieben ist ein selbst oder ungerade Zahl. Wenn es gerade ist, speichere ich es in der a-Variable.

Antwort

3

Ärgere dich nicht einmal mit der isdigit. Fahren Sie fort und versuchen Sie die Konvertierung in int und fangen Sie die Ausnahme ab, wenn es fehlschlägt.

result = 0 
with open('httpd-access.txt') as f: 
    for line in f: 
     try: 
      i = int(line.strip()[-1:]) 

      if(i % 2 == 0): 
       result += i 

     except ValueError: 
      pass 

print('result = %d' % result) 
+0

Das hat den Trick! Nur neugierig, wie es Teig funktioniert, damit ich es verstehen kann .. Sie gehen durch die Linie in der Foor Schleife Mit der ersten Zeile in der Probe, erhalten Sie th Die letzte Ziffer, aber was passiert da, wenn es nicht ein int wäre, den du zurückholst? Würde es dann zu dem ausgenommenen Teil gehen? – anderssinho

+1

Ja, wenn die Konvertierung fehlschlägt, wird die Ausnahme "ValueError" ausgelöst. Das wird abgefangen und der Code läuft nach dem try-Block weiter. 'pass' macht effektiv nichts. Es muss nur da sein, um die Einzugserfordernisse zu erfüllen. Sie können auch ein 'continue' dort setzen, wenn Sie wollten. –

1

isdigit() zurück True oder False, die digitFirst zugeordnet ist (versuchen Sie es drucken!).
True und False werden als 0 bzw. 1 in mathematischen Operationen ausgewertet.
Also, es immer die if digitFirst % 2 == 0 übergeben, wenn digitFirst0 ist, was bedeutet, 0 wird immer zu result hinzugefügt.

Beachten Sie auch, dass counter immer 0 während der for Schleife und wird auf 1 erst, nachdem es angehoben, was bedeutet, dass Sie immer mit dem ersten Buchstaben jeder Zeile zu arbeiten.

Der Zweck von counter ist unklar, da es nur als "der Index des Buchstabens, den Sie erhalten" jeder Zeile verwendet.

+0

Ah ok, wird der Zähler in der Schleife dann bewegen :) , warum ich vielleicht nichts bekommen, wenn ich versuche, unsere Sachen zu drucken und immer in meinem sonst unten in meinem Code zu erhalten: http: // pastebin.com/LDBWSrTa – anderssinho

+0

Okay, also kann ich isdigit() verwenden, um zu sehen, ob es sich um eine Ziffer handelt, aber wie kann ich danach das int abrufen? Ich denke ich speichere die Indexposition und dann uns oder? – anderssinho

+0

Sie können auf Buchstaben in einer Zeichenfolge problemlos zugreifen, da sie iterierbar ist. Das erste Element kann mit 'line [0]' aufgerufen werden, während das letzte mit 'line [-1]'. – galah92

1
result = [] 
with open('https-access.txt') as fin: 
    for line in fin: 
     l = line.strip() 
     if l[-1].isdigit(): 
      if int(l[-1]) % 2 == 0: 
       result.append(int(l[-1])) 
ANSWER = sum(result) 

Wie sieht Ihre Datei aus? Sie möchten die letzte Ziffer in jeder Zeile berechnen, wenn sie gerade ist. In Ihrem Code fängt "line [counter]" den ersten Index jeder Zeile ein.

Zum Beispiel, wenn die Daten in der Datei ist wie folgt:

some_data 2 

seit Zähler auf 0 gesetzt ist, also line [ 'counter'] in Ihrem Code wird der erste Index immer überprüfen, die wird 's' im obigen Beispiel.

Wenn Sie ein paar Zeilen aus der Datei, die Sie öffnen werden, veröffentlichen können, kann ich möglicherweise etwas vorschlagen.

+0

Ich aktualisierte die Frage mit einer Codezeile in der Datei, die ich abzurufen versuche. Wenn ich dein Beispiel versuche, bekomme ich eine Fehlermeldung "TypeError: nicht unterstützte Operandentyp (en) für +: 'int' und 'str'" – anderssinho

+0

Das ist, weil mein Beispiel anfügt, str zu listen und nicht int. Ich habe das Beispiel bearbeitet. – user6037143

Verwandte Themen