2016-07-27 6 views
2

Ich bin neu in dieser Community und dieser Computersprache. Kürzlich arbeite ich an etwas Übung und eine Frage hat mich für mehrere Tage abgehört. Hier ist die Frage: Lesen Sie die Datei test.txt (Index: "CDEF", "ABC", "FIJK") in Python, und richten Sie es neu in "ABC", "CDEF", "FIJK" und jeweils gegeben Zeichen einen Wert basierend auf der alphabetischen Reihenfolge (zB "ABC" = 1 + 2 + 3 = 6), zuletzt den Wert des Index drucken (zB A + B + C = 6, "ABC" an erster Stelle steht) 1, so ist der Wert von "ABC" 6, der Wert von "CDEF" ist 18 * 2 = 36 (2 stellt den zweiten Platz der Liste dar) "FIJK" ist 36 * 3 = 108) drucke 150 aus (6 + 36) +108)Python - Wie gebe ich einen String-Wert, nachdem ich die Datei

Ich habe gerade keinen Code. Ich denke daran, wenn ich es mit Wörterbuchschlüssel mache. Aber gibt es einen brillanten Weg, es zu tun, oder wenn die Datei heute nicht der Index oben ist. Soll ich es in Schleife machen?

+3

Sie brauchen keine Wörterbücher. Listen sind hier dein Freund. Und insbesondere nach "Listenverständnis" suchen. Das ist was du willst. Willkommen in der Gemeinschaft. Sind Sie auf der Suche nach dem Code, um dies zu erreichen, oder nur Vorschläge für den Anfang? –

+0

Hallo! @Ahop. Wenn es dich nicht stört. Ich hoffe, ich kann vielleicht einen Beispielcode bekommen. Vielleicht könnte es mich umleiten. Vielen Dank! – wadestrikers

Antwort

1

Zuerst nehmen wir an, dass Sie eine Datei haben sample.txt genannt mit folgendem Inhalt:

CDEF 
ABC 
FIJK 

SCRIPT

Hier wird das Skript zu erreichen, was (glaube ich) Sie sind nach:

with open('so.txt', 'r') as file: 
    lines = [x.replace('\n', '') for x in file.readlines()] 
    print "lines: ", lines 
    lines.sort() 
    print "lines sorted: ", lines 

    sums = [sum([ord(letter.lower()) - 96 for letter in line]) for line in lines] 
    print "sums: ", sums 

    products = [x * (sums.index(x) + 1) for x in sums] 
    print "products: ", products 

    total = sum(products) 
    print "total: ", total 

OUTPUT

012.351.

Die Ausgabe des obigen Code:

lines: ['CDEF', 'ABC', 'FIJK'] 
lines sorted: ['ABC', 'CDEF', 'FIJK'] 
sums: [6, 18, 36] 
products: [6, 36, 108] 
total: 150 

ERKLÄRUNG

(1) öffnen so.txt als schreibgeschützte Datei, und speichert es als eine Variable: file.

with open('so.txt', 'r') as file: 

(2) Nehmen Sie jede Linie in file und alle Zeilenumbrüche entfernen und sie in eine Liste drehen.

lines = [x.replace('\n', '') for x in file.readlines()] 

(3) Sortieren Sie die Liste.

lines.sort() 

(4) Dies ist ein wenig schwierig, da es ein paar Dinge tut.

sums = [sum([ord(letter.lower()) - 96 for letter in line]) for line in lines] 

Also, machen wir es in zwei Komponenten brechen:

sums = [<do_something_here with line> for line in lines] 

Dieser Code ein list comprehension genannt wird. Es erstellt eine neue Liste mit jedem Element der lines Liste und macht etwas. Es entspricht in etwa:

sums = [] 
    for line in lines: 
     sums.append(<do_something_here with line>) 

Also, mit der line Variable (die einen String wäre), wir, dass auch als Liste und iterieren es in einer anderen Liste Verständnis behandeln:

[ord(letter.lower()) - 96 for letter in line] 

Für jede letter in der line Zeichenfolge wandelt es es in Kleinbuchstaben um, macht es zu einer ASCII-Ordinalzahl und subtrahiert 96, damit es mit a == 1 beginnt. Sie können eine Liste von all ASCII numbers here sehen.

Schließlich, mit einer Liste, die jetzt Zeichenfolgen in Zahlen konvertiert wird, wenden wir sum() auf diese Liste an.

Wir haben jetzt:

[6, 18, 36] 

(5) Wir nehmen diese Liste der sums und andere Liste Verständnis geben. Dieses Mal besteht das Ziel darin, jede Zahl zu nehmen und sie mit ihrer index zu multiplizieren. Sie können den Index eines Elements abrufen, indem Sie aufrufen. Wie folgt:

products = [x * (sums.index(x) + 1) for x in sums] 

(6) Schließlich alles, was wir tun müssen, ist die Summe, die letzte Liste, die wir wieder mit der sum() Methode.

total = sum(products) 

Ich hoffe, ich habe die Frage beantwortet, die Sie wollten.

+0

Vielen Dank für das Tutorial !! Jetzt weiß ich genau, wie man das Listenverständnis richtig einsetzt. Du bist der echte MVP! – wadestrikers

+0

:-) froh zu helfen. Ich erinnere mich an mich, sobald ich sie herausgefunden hatte, öffnete es mir die Welt der Python. Wenn Ihnen die Antwort gefällt, können Sie auf das Kontrollkästchen klicken, um es zu akzeptieren. –

+0

@Ahop in Schritt 4, ist es notwendig, um Buchstaben nach unten zu übertragen? [ord (Buchstabe()) - 64 für den Buchstaben in der Zeile] ist das gleiche wie das, was Sie getan haben? – wadestrikers

0

Sie könnten ein verschachteltes Verständnis verwenden:

>>> lst = ["ABC", "CDEF", "FIJK"] 
>>> sum((idx + 1) * sum(ord(letter) - 64 for letter in item) for idx, item in enumerate(lst)) 
150 

Wenn Sie einen regelmäßige for-Schleife mit einem Akkumulator verwenden mögen:

Ihnen
total_sum = 0 
for idx, item in enumerate(lst): 
    total_sum += (idx + 1) * sum(ord(letter) - 64 for letter in item) 
print(total_sum) 

ord("A") gibt den ASCII-Wert ein Zeichen. Für "A" ist es 65. Deshalb subtrahiere ich im Beispiel 64. So erzeugt (ord(letter) - 64 for letter in item) zum Beispiel für jedes Zeichen in der Zeichenfolge "ABC" eine Zahl, und dann summiert sie die Summe. Dieser Wert wird dann in total_sum akkumuliert, der nach der ersten Iteration der for-Schleife 6 enthalten wird.

+0

danke für die Antwort. Aber wie kann ich es in Schleife schreiben? – wadestrikers