在python中根据发生情况对列表进行计数/排序

在python中根据发生情况对列表进行计数/排序,python,python-2.7,python-3.x,count,Python,Python 2.7,Python 3.x,Count,我想用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 首先,我想把帐号和金额结合起来,像这样 Acct

我想用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
首先,我想把帐号和金额结合起来,像这样

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)出现两次,因此我想将第一个元组计算为1,第二个元组计算为2

同样,tuple(7555 | 50)出现两次,第一次出现将计为1,第二次为2, (7555 | 60)只显示一次,所以我算作1

我尝试了好几种方法,但它没有给我想要的。 非常感谢你的帮助


谢谢

您应该使用一个嵌套的dict,其中key是
account
,key是另一个dict,其
amount
作为
key
,外观作为值

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])

下面使用了要求对输入进行排序的
itertools.groupby
,以及为我们提供iterable中项目索引的
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
这导致:

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

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

这就是人们过去写这些东西的方式。现在,
collections
模块中有
defaultdict
Counter
,大大简化了事情(例如,在更新密钥值之前,无需测试密钥是否存在)。@PaulMcG即将用它们编辑我的答案,谢谢@PaulMcG请建议对我的编辑进行任何改进:)未经测试,但是如果您更改为
data\u dict=defaultdict(Counter)
,那么您的更新语句应该只是变成
data\u dict[acc][amount]+=1
,其他所有内容都应该保持不变。