2012-03-28 1 views
2

Ich bin ziemlich neu zu Python, aber ich denke, ich verstehe schnell.Verwendung von Bedingungen mit variablen Strings in Python

Wie auch immer, ich mache ein Programm (nicht für die Klasse, aber um mir zu helfen) und bin auf ein Problem gestoßen.

Ich versuche, eine Liste von Dingen zu dokumentieren, und nach Dingen, die ich meine, fast tausend von ihnen, mit einigen zu wiederholen. Also mein Problem ist das:

Ich möchte nicht zu der Liste redundante Namen hinzufügen, stattdessen möchte ich einfach eine 2x oder 3x vor (oder nach, was einfacher ist) hinzufügen, und dann schreiben Sie das auf a TXT-Dokument.

Mir geht es gut mit dem Lesen und Schreiben von Textdokumenten, aber mein einziges Problem ist die bedingte Anweisung, ich weiß nicht, wie man es schreibt, noch kann ich es online finden.

for lines in list_of_things: 
    if(lines=="XXXX x (name of object here)"): 

Und dann was auch immer unter der if-Anweisung. Mein einziges Problem ist, dass das "XXXX" durch irgendeine Stringnummer ersetzt werden kann, aber ich weiß nicht, wie man eine Variable in eine Zeichenkette einfügt, wenn das irgendeinen Sinn ergibt. Selbst wenn es in ein int umgewandelt wird, weiß ich immer noch nicht, wie man eine Variable innerhalb einer Bedingung verwendet.

Das einzige, was ich mir vorstellen kann, ist mehrere if-Anweisungen zu machen, die wirklich lang wären.

Irgendwelche Vorschläge? Ich entschuldige mich für die Textwand.

+0

Um zu verdeutlichen, sagen Sie, Sie haben eine Quelle mit potenziell redundanten Linien, und Sie möchten schließlich eindeutige Zeilen mit einem Präfix ausgeben? Ist auch die Reihenfolge wichtig? – jdi

Antwort

5

ich über die Zeilen in der Eingabedatei Looping würde vorschlagen, und einen Schlüssel in einem Wörterbuch für jedes Einfügen Sie finden, dann wird der Wert erhöht wird bei für jede Instanz des Wertes, den Sie danach finden, wird der Schlüssel nach dem anderen ausgegeben. Anschließend wird die Ausgabedatei aus diesem Wörterbuch generiert.

catalog = {} 
for line in input_file: 
    if line in catalog: 
     catalog[line] += 1 
    else: 
     catalog[line] = 1 

alternativ

from collections import defaultdict 
catalog = defaultdict(int) 
for line in input_file: 
    catalog[line] += 1 

Dann einfach durch diese dict laufen und drucken in eine Datei aus.

+0

Ich denke, das ist, was er gefragt hat. Genau wie das, was ich vorschlagen wollte. – jdi

+1

@NolenRoyalty: Letztendlich würde ich es vorschlagen, aber es sollte ein angehängtes bisschen Info sein, nachdem ich zuerst die Standard-Wörterbuchweise erklärt habe, da er ein neuer Python-Programmierer ist. – jdi

+0

@jdi Fair genug, die Lösung ist in beiden Fällen richtig (vorausgesetzt, wir haben die Frage richtig verstanden). –

1

Sie suchen, wie für regular expressions und etwas sein kann

for line in text: 
    match = re.match(r'(\d+) x (.*)', line) 
    if match: 
     count = int(match.group(1)) 
     object_name = match.group(2) 
     ... 
+0

Ich habe das Gefühl, dass das Muster, das der OP zeigte, eine peinliche Annäherung war, die Linien zählen zu wollen, und dass er diese Saiten vorformatiert hatte, als er sie einnahm und sie dann analysieren wollte. – jdi

0

Dies sollte es tun:

a = [1,1,1,1,2,2,2,2,3,3,4,5,5] 
from itertools import groupby 
print ["%dx %s" % (len(list(group)), key) for key, group in groupby(a)] 
+1

Besonders mit dem OP, der zugegebenermaßen ein neuer Python-Programmierer ist, sollten Sie mit dieser Antwort vielleicht etwas weniger obskur sein. – jdi

+0

Er sagte, er fängt schnell :) hehe Es tut mir leid, wenn das zu weit fortgeschritten war oder so, ich hoffe nur, dass es dem OP hilft, aber denk daran, dies ist eine öffentliche Frage und Leute, die keine Anfänger sind, könnten später vorbeikommen. – Trufa

+0

Nun, wenn Sie etwas fortgeschritten vorschlagen, zumindest reparieren Sie es, so dass es nicht konstante String-Verkettung verwendet: '["% dx% s "% (len (Liste (Gruppe)), Schlüssel) für Schlüssel, Gruppe in groupby (a)] ' – jdi

0

So etwas wie das?

list_of_things=['XXXX 1', 'YYYY 1', 'ZZZZ 1', 'AAAA 1', 'ZZZZ 2'] 

for line in list_of_things: 
    for e in ['ZZZZ','YYYY']: 
     if e in line: 
      print line 

Ausgang:

YYYY 1 
ZZZZ 1 
ZZZZ 2 

Sie auch if line.startswith(e): oder einen regulären Ausdruck verwenden können (wenn ich Ihre Frage bin zu verstehen ...)

0

Um eine Variable in einer Zeichenfolge enthalten, verwenden format():

 
>>> i = 123 
>>> s = "This is an example {0}".format(i) 
>>> s 
'This is an example 123' 

In diesem Fall ist der {0} indicat es, dass Sie eine Variable dort setzen werden. Wenn Sie mehr Variablen haben, verwenden Sie "This is an example {0} and more {1}".format(i, j)" (also eine Zahl für jede Variable, beginnend mit 0).

0

Es gibt zwei Möglichkeiten, dies zu erreichen. 1) so etwas wie die folgenden ein Wörterbuch mit der Anzahl der Elemente zu erfassen und dann eine Liste jedes Element zu formatieren mit seiner Zählung

list_of_things = ['sun', 'moon', 'green', 'grey', 'sun', 'grass', 'green'] 
listItemCount = {} 
countedList = [] 
for lines in list_of_thing: 
    if lines in listItemCount: 
     listItemCount[lines] += 1 
    else: 
     listItemCount[lines] = 1 
for id in listItemCount: 
    if listItemCount[id] > 1: 
     countedList.append(id+' - x'str(listItemCount[id])) 
    else: 
     countedList.append(id) 
for item in countedList: 
    print(item) 

der Ausgang des oben wäre

sun - x2 
grass 
green - x2 
grey 
moon 

oder 2) mit Sammlungen, um die Dinge einfacher als unter

import collections 

list_of_things = ['sun', 'moon', 'green', 'grey', 'sun', 'grass', 'green'] 
listItemCount = collections.Counter(list_of_things) 
listItemCountDict = dict(listItemCount) 
countedList = [] 
for id in listItemCountDict: 
    if listItemCountDict[id] > 1: 
     countedList.append(id+' - x'str(listItemCountDict[id])) 
    else: 
     countedList.append(id) 
for item in countedList: 
    print(item) 

der Ausgang des oben würde

gezeigt
sun - x2 
grass 
green - x2 
grey 
moon