2017-07-10 9 views
2

このスクリプトをPythonで記述したいと思います。 クレジットカード取引のデータセットがあります。日付、口座番号、金額(購入またはクレジット/返金のいずれか) データはこの出現時のPythonベースのリストのカウント/ランク

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

まず次のようになります、私は、量と口座番号を組み合わせて、このような何かが欲しいが含まれていること

4445 | 20 
4445 | 30 
4445 | 30 

7555 | 50 
7555 | 50 
7555 | 60 

次に、リスト全体のタプルは、それらの出現に基づいてカウントされます。例:あなたが見ることができるように

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

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

、タプル(4445 | 20)一度だけ表示され、私は1 としてタプル(4445 | 30)をカウントするには2回出現したので、私は最初の数をカウントしたいですタプルは1、2番目は2となります。

同じタプル(7555 | 50)が2回表示され、最初の出現は1、次に2は 、(7555 | 60)は1回だけ表示されるため、

私はいくつかの方法を試していますが、それは私が欲しいものを与えてくれませんでした。 本当にありがとうございます。

ありがとうございました。

答えて

1

次のようにソートされる入力を必要とする、itertools.groupbyを使用し、enumerate反復可能に私たちの項目のインデックスを与えています。各行を文字列として扱い、その後ろに数を追加します。

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 

これは、その結果:これは1がこのようなものを書くために持っていた方法です

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

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

キーがaccountで、キーがamountと別のディクテーションで、値がkeyであるネストされたdictを使用する必要があります。

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

。 'collections'モジュールに' defaultdict'と 'Counter'があります。物事を大幅に簡素化します(例えば、値を更新する前にキーの存在をテストする必要はありません)。 – PaulMcG

+0

@PaulMcG私の答えを編集するつもりです、ありがとうございます! – PYA

+0

@PaulMcG私の編集で改善を提案してください:) – 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])]))  
関連する問題