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

时间:2017-07-10 02:39:04

标签: 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

然后,我将根据它们的出现计算整个列表中的每个元组。例如:

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。

同样,元组(7555 | 50)出现两次,第一次出现将计为1,接下来为2, 并且(7555 | 60)只显示一次,所以算作1。

我正在尝试几种方法,但它没有给我我想要的东西。 真的很感谢你的帮助。

感谢。

3 个答案:

答案 0 :(得分: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])]))    

答案 1 :(得分:1)

以下使用Batch Process,它要求对输入进行排序,以及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

答案 2 :(得分:0)

你应该使用嵌套字典,其中键为account,键是另一个字典,amountkey,外观为值。

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