在python中根据发生情况对列表进行计数/排序
我想用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
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
,其他所有内容都应该保持不变。