使用python在字典中计算和存储值

2024-09-19 23:34:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我想存储的结果,并有能力计算的次数'SD'发生的每一个特定的身份证号码(356788/356849/356851)和多少'图像'为每个身份证号码。你知道吗

结果如下:

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'}}。。。你知道吗

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


Tags: in图像imageinfoforifossd
1条回答
网友
1楼 · 发布于 2024-09-19 23:34:35

所以这里有两个问题。你知道吗

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可能适合您的需要。您可能还想看看迭代器做什么(请参见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

相关问题 更多 >