python将csv文件读取为字典,并对计数器进行排序和递增

python将csv文件读取为字典,并对计数器进行排序和递增,python,csv,dictionary,Python,Csv,Dictionary,我希望有人给我指出正确的方向。从我所读到的,我相信使用字典最适合这种需要,但我决不是一个熟练的程序员,我希望有人能给我一些启示,帮我一把。这是我的CSV文件: 11362672,091914,100914,100.00,ITEM,11,N,U08 12093169,092214,101514,25.00,ITEM,11,N,U10 12162432,091214,101214,175.00,ITEM,11,N,U07 11362672,091914,100914,65.00,ITEM,11,N,

我希望有人给我指出正确的方向。从我所读到的,我相信使用字典最适合这种需要,但我决不是一个熟练的程序员,我希望有人能给我一些启示,帮我一把。这是我的CSV文件:

11362672,091914,100914,100.00,ITEM,11,N,U08
12093169,092214,101514,25.00,ITEM,11,N,U10
12162432,091214,101214,175.00,ITEM,11,N,U07
11362672,091914,100914,65.00,ITEM,11,N,U08
11362672,091914,100914,230.00,ITEM,11,N,U08
我希望将第一列视为键,并将以下列视为该键的值,以便:

  • 按键对数据进行排序
  • 反击
  • 附加计数器
  • 这是我想要达到的结果:

    1,11362672,091914,100914,100.00,ITEM,11,N,U08 # occurrence 1 for key: 11362672
    2,11362672,091914,100914,65.00,ITEM,11,N,U08 # occurrence 2 for key: 11362672
    3,11362672,091914,100914,230.00,ITEM,11,N,U08 # occurrence 3 for key: 11362672
    1,12093169,092214,101514,25.00,ITEM,11,N,U10 # occurrence 1 for key: 12093169
    1,12162432,091214,101214,175.00,ITEM,11,N,U07 # occurrence 1 for key: 12162432
    
    我需要保持每一行的完整性,这就是为什么我认为字典会工作得最好的原因。我没有很多,但这是我开始的。这就是我需要帮助排序、计数器和附加计数器的地方

    import csv
    with open('C:/Download/item_report1.csv', 'rb') as infile:
         reader = csv.reader(infile)
         dict1 = {row[0]:row[1:7] for row in reader}
         print dict1
    
    给我:

    {
    '11362672': ['091914', '100914', '230.00', 'ITEM', '11', 'N'], 
    '12093169': ['092214', '101514', '25.00', 'ITEM', '11', 'N'], 
    '12162432': ['091214', '101214', '175.00', 'ITEM', '11', 'N']
    }
    

    简单地说,您应该使用计数器对键进行计数,并使用列表存储行

    当您在csv中读取时,记录您看到键值的次数,并在读取时将其插入每行的开头

    读入文件后,可以先按键值排序,然后按出现计数器排序

    import csv
    
    counter = {}
    data = []
    
    with open('report.csv','rb') as infile:
      for row in csv.reader(infile):
        key = row[0]
        if key not in counter:
          counter[key] = 1
        else:
          counter[key] += 1
        row.insert(0,counter[key])
        data.append(row)
    
    for row in sorted(data,key=lambda x: (x[1],x[0])):
      print row
    
    这是同样的东西,书写略有不同,4个空格符合官方风格指南,而不是我个人喜欢的两个

    import csv
    
    # key function for sorting later
    def second_and_first(x):
        return (x[1],x[0])
    
    # dictionary to store key_fields and their counts
    counter = {}
    # list to store rows from the csv file
    data = []
    
    with open('report.csv','rb') as infile:
        for row in csv.reader(infile):
            # For convenience, assign the value of row[0] to key_field
            key_field = row[0]
            # if key_field is not in the dictionary counter. Add it with a value of 1
            if key_field not in counter:
                counter[key_field] = 1
            # otherwise, it is there, increment the value by one.
            else:
                counter[key_field] += 1
            # insert the value associated with key_field in the counter into the start of
            # the row
            row.insert(0,counter[key_field])
            # Append the row to 
            data.append(row)
    
    for row in sorted(data,key=second_and_first):
        print row
    

    在排序之前(数据,key=lambda x:(x[1],x[0]),我了解一切。不用说上面的代码是有效的,我还有一些lambda阅读要做。非常感谢你,你是一个天才。欢迎你,尽管我对天才的声明有不同的标准。排序函数接受关键字函数参数“key”,该参数应用于iterable的每个元素一次,以创建用于比较的键。当我不在电话上时,我会把它写成函数定义听起来不错,马特,公司升级了机器但没有软件,所以我一直在写我自己的程序,但我肯定被困在这里了。当然可以。问题,你怎么没有添加
    行。插入(0,计数器[key])
    数据。将(行)
    附加到
    if
    else
    语句?顺便说一句,我使用这两种方法得到相同的输出。是否可以通过等待
    IF/ELSE
    完成,然后插入计数器并将行附加到数据列表中,从而损害行?我只是想大声点-谢谢,在这种情况下,直到排序的
    之前,您还没有完全理解所有内容。
    行.insert
    data.append
    不在
    if/else
    块中,并且将被执行,无论遵循
    if/else
    的哪个部分。