【问题标题】:counting and storing values in a dictionary using python使用python计算和存储字典中的值
【发布时间】:2015-01-28 04:27:41
【问题描述】:
def prodInfo():
    from collections import Counter
    prodHolder = {}
    tempdict = {}
    try:
        os.chdir(copyProd)
        for root, dirs, files in os.walk('.'):
            for data in files:

                fullpath = os.path.join(root, data)
                with open(fullpath, 'rt') as fp:
                    for info in fp:
                        info = info.strip()
                        if info.startswith('prodType'):
                            info0 = info.split('=')[1]
                            info0 = info0.replace(';','')
                            info0 = info0.replace('"','')
                        if info.startswith('acq'):
                            info1 = info.split('=')[1]  
                            info1 = info1.replace(';','')
                            info1 = info1.replace('"','')
                        if info.startswith('ID_num'):
                            info2 = info.split('=')[1]
                            info2 = info2.replace(';','')
                            info2 = info2.replace('"','')

                    print info0 + info1 + info2

产生这个结果:

SD Acq645467 356788
SD Acq645467 356788
SD Acq645467 356788
SD Acq645467 356788
SD Acq645467 356788
SD Acq645467 356788
SD Acq645467 356788
SD Acq645467 356788
SD Acq645467 356788
Image Acq645467 356788
Image Acq645467 356788
Image Acq645467 356788
Image Acq645467 356788

SD Acq644869 356849
SD Acq644869 356849
Image Acq644869 356849

SD Acq644247 356851
SD Acq644247 356851
Image Acq644247 356851

我想存储结果并能够计算每个特定 ID 号 (356788/356849/356851) 出现“SD”的次数以及每个 ID 号有多少“图像”。

结果如下:

9 - SD / 4 - 356788 的图像

2 - SD / 1 - 356849 的图像

2 - SD / 1 - 356851 的图像

虽然我最好将项目存储在字典中但无法成功计算值。这是我用来将信息存储在字典中的代码。

prodHolder[info2] = {'SD/Image': info0, 'Acq' : info1}
total_Acq = prodHolder
print prodHolder

结果是:

{'356788': {'SD/Image': 'SD', 'Acq': Acq645467'}} ...

每次运行该函数时,都会输入一组不同的值,从而产生不同的结果。

【问题讨论】:

    标签: python dictionary counting


    【解决方案1】:

    所以这里有两个问题。

    1) 如何将结果写入文件:

    我会使用 csv(逗号分隔值)。 Python 有一个很棒的模块 (csv)

    您可以修改您的代码,使其在读取文件的同时(就像它已经这样做的那样),将info0info1info2 写入.csv 文件:

    def prodInfo():
        from collections import Counter
        prodHolder = {}
        tempdict = {}
        try:
            os.chdir(copyProd)
            for root, dirs, files in os.walk('.'):
                    for data in files:
                    fullpath = os.path.join(root, data)
                    with open(fullpath, 'r') as fp,\
                         open('./stack59.write.csv', 'w') as fw:
    
                        writer = csv.writer(fw)
                        for info in fp:
                        # [ . . . ]
                        # Yadda yadda yadda
                        print info0 + info1 + info2
                        writer.writerow([info0, info1, info2])
    

    这将创建一个文件stack59.write.csv,看起来像:

    SD,Acq645467,356788
    SD,Acq645467,356788
    SD,Acq645467,356788
    [ . . . ]
    SD,Acq644247,356851
    SD,Acq644247,356851
    Image,Acq644247,356851
    

    2) 如何统计常见结果:

    为此,itertools.groupby 可能会满足您的需求。您可能还想看看 iterators 做了什么(参见 thisthisthis

    首先,我将数据存储到一个矩阵中:

    def prodInfo():
        from collections import Counter
        prodHolder = {}
        tempdict = {}
        data_matrix = []   # NEW !
        try:
            os.chdir(copyProd)
            for root, dirs, files in os.walk('.'):
                for data in files:
                    # [ . . . ]
                    # Yadda, yadda, yadda...
                    print info0 + info1 + info2
                    data_matrix.append([info0, info1, info2])  # NEW!
    

    然后您可以随意分组data_matrix。例如:

    # First, group by picture id (356788, 356849...), which is
    # the third column of the data
    for group_by_id in itertools.groupby(data_matrix,
                                         lambda x: x[2]):
        # Now, within those groups, group by type, the first column
        # of the data (SD, Image...)
        for group_by_type in itertools.groupby([a for a in group_by_id[1]],
                                               lambda y: y[0]):
            print "%s: %s %s" % (group_by_id[0],
                                 len([a for a in group_by_type[1]]),
                                 group_by_type[0])
        print ''
    

    哪些输出:

    356788: 9 SD
    356788: 4 Image
    
    356849: 2 SD
    356849: 1 Image
    
    356851: 2 SD
    356851: 1 Image
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      • 2016-05-01
      相关资源
      最近更新 更多