2017-07-10 4 views
2

Ich möchte dieses Skript in Python schreiben. Ich habe einen Datensatz von einer Reihe von Kreditkartentransaktionen. Das ist das Datum, die Kontonummer, die Menge (entweder einen Kauf oder eine Gutschrift/Rückerstattung) Daten wie diesescount/rang eine Liste in Python basierend auf dem Auftreten

Acct Number --- Amount 
4445 --- $20 
4445 --- $30 
4445 --- $30 
7555 --- $50 
7555 --- $50 
7555 --- $60 

Zuerst schauen, würde Ich mag die Kontonummer mit der Menge kombinieren, so etwas wie diese

4445 | 20 
4445 | 30 
4445 | 30 

7555 | 50 
7555 | 50 
7555 | 60 

Dann werde ich jedes Tupel innerhalb der ganzen Liste basierend auf dem Auftreten von ihnen zählen. Zum Beispiel:

4445 | 20 | 1 
4445 | 30 | 1 
4445 | 30 | 2 

7555 | 50 | 1 
7555 | 50 | 2 
7555 | 60 | 1 

Wie Sie sehen können, das Tupel (4445 | 20) erscheint nur einmal, ich möchte als 1 Das Tupel zählen (4445 | 30) erscheint zweimal, so möchte ich die erste zählen Tupel als 1 und die Sekunde als 2.

Gleiches, Tupel (7555 | 50) erscheint zweimal, das erste Erscheinen zählt als 1, nächstes als 2, und das (7555 | 60) zeigt nur einmal, also ich zählen als 1.

Ich versuche mehrere Möglichkeiten, aber es gab mir nicht, was ich will. Ich schätze Ihre Hilfe sehr.

Danke.

Antwort

1

Im Folgenden verwendet itertools.groupby, die die Eingabe sortiert werden muss, und enumerate, die uns die Indizes der Elemente in einem iterable gibt. Wir behandeln jede Reihe als eine Zeichenkette und hängen dann die Zählung danach an.

L = [["4445 | 20","4445 | 30","4445 | 30"], 
    ["7555 | 50","7555 | 50","7555 | 60"]] 

from itertools import groupby 

R = [[ r + ' | ' + str(i+1) 
    for h,g in groupby(A) 
    for i,r in enumerate(g)] for A in L] 

for A in R: 
    for r in A: 
     print r 
    print 

Daraus ergibt sich:

4445 | 20 | 1 
4445 | 30 | 1 
4445 | 30 | 2 

7555 | 50 | 1 
7555 | 50 | 2 
7555 | 60 | 1 
0

sollten Sie ein verschachteltes Diktat verwenden, wo der Schlüssel account ist und Schlüssel ist ein anderes dict mit amount als key und Erscheinungen als der Wert.

from collections import defaultdict 
data_dict = defaultdict(dict) 
with open(file,r): 
    for line in file: 
    acc.amount = line.split(',')#assuming the data is split based on a comma 
    data_dict[acc][amount] = data_dict[acc].get(amount,0)+1 
#print it like so 
for key in data_dict: 
    for am in data_dict[key]: 
    print(key,data_dict[key],data_dict[key][am]) 
+0

Dies ist, wie man verwendet haben, um diese Sachen zu schreiben. Jetzt gibt es 'defaultdict' und' Counter' im Modul 'collections', die die Dinge sehr vereinfachen (es ist nicht notwendig, vor dem Aktualisieren des Werts zu testen, ob ein Schlüssel vorhanden ist). – PaulMcG

+0

@PaulMcG über meine Antwort mit ihnen zu bearbeiten, danke! – PYA

+0

@PaulMcG bitte irgendwelche Verbesserungen in meiner Bearbeitung vorschlagen :) – PYA

1
from collections import Counter 

lines = list() 

with open("data.text", 'r', encoding="utf-8") as data: 
    for line in data[1:]: 
     lines.append(line.split(" --- $")) 

ct = Counter(lines) 

for item in ct: 

    print(' | '.join([*item, str(ct[item])]))  
Verwandte Themen