Python比较和构建经过验证的词典列表

时间:2017-04-19 12:49:47

标签: python python-3.x dictionary

所以我试图将大量的数据,100万+图像分类到唯一相关的媒体中。

为了达到这个目的,我创建了一个字典结构,它包含了这些图像的所有数据。这部分很好,但是我很难将相关图像放到新的精简列表中。下面是一些读入脚本的示例数据。

100653067_00.jpg | (671, 900) | D://media/pr/product\1\0\100653067_00.jpg
100653067_01.jpg | (656, 900) | D://media/pr/product\1\0\100653067_01.jpg
100653067_02.jpg | (660, 900) | D://media/pr/product\1\0\100653067_02.jpg
1008661118_00.jpg | (500, 448) | D://media/pr/product\1\0\1008661118_00.jpg
1008668062_00.jpg | (1500, 1120) | D://media/pr/product\1\0\1008668062_00.jpg
1008669063_00.jpg | (1500, 1120) | D://media/pr/product\1\0\1008669063_00.jpg
101020202_00.jpg | (1000, 760) | D://media/pr/product\1\0\101020202_00.jpg
1008668062_01.jpg | (100, 110) | D://media/pr/product\1\0\1008668062_01.jpg
1008669063_001.jpg | (100, 110) | D://media/pr/product\1\0\1008669063_001.jpg
101020202_01.jpg | (504, 750) | D://media/pr/product\1\0\101020202_01.jpg

我在拍摄最大图像时遇到问题,即比较ID值。例如,101020202_00.jpg应该取自101020202_01.jpg,因为它的总体尺寸最大。

for item in img_dict:
    tempStore = img_dict[item]
    locationVar = ''
    idVar = ''
    for item in img_dict:
        i = img_dict[item]
        if re.match(tempStore['ID']+"([a-zA-Z0-9_]*)", i['ID']):
            if tempStore['Resolution X'] > i['Resolution X'] or tempStore['Resolution Y'] > i['Resolution Y']:
                locationVar = tempStore['Location']
                idVar = tempStore['ID']

    highestResFile[idVar] = {'ID':idVar, 'Location': locationVar}

img_dict输出的一个例子:

{'000002353911_1': {'ID': '000002353911_1',
                    'Image Name': '000002353911_1.jpg',
                    'Location': 'D://media/pr/product\\0\\0\\000002353911_1.jpg',
                    'Resolution X': 406,
                    'Resolution Y': 406},
 '000002355373_1': {'ID': '000002355373_1',
                    'Image Name': '000002355373_1.jpg',
                    'Location': 'D://media/pr/product\\0\\0\\000002355373_1.jpg',
                    'Resolution X': 406,
                    'Resolution Y': 406}}

1 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点,但我认为必不可少的核心理念是按照他们的基本名称组织项目"因此,您不必遍历所有一百万个项目以找到需要比较的项目。 " foo_1.jpg"和" foo_23.jpg"具有相同的基本名称,因此您应该将它们相互比较,但不要与" bar_42.jpg"进行比较。使用基本名称作为字典的键似乎是合乎逻辑的选择。

import re

def size(item):
    return item["dimensions"][0] * item["dimensions"][1]

data = {}
with open("data.dat") as file:
    for line in file:
        filename, raw_dimensions, path = line.strip().split(" | ")
        dimensions = [int(x) for x in re.match(r"\((\d*), (\d*)\)", raw_dimensions).groups()]
        base_name = filename.partition("_")[0]
        item = {
            "filename": filename,
            "base_name": base_name,
            "dimensions": dimensions,
            "path": path
        }
        if base_name not in data or size(item) > size(data[base_name]):
            data[base_name] = item

print(list(data.values()))

结果(为了清楚起见,我添加了空格):

[
    {'path': 'D://media/pr/product\\1\\0\\101020202_00.jpg',  'dimensions': [1000,  760], 'base_name': '101020202',  'filename': '101020202_00.jpg'}, 
    {'path': 'D://media/pr/product\\1\\0\\1008669063_00.jpg', 'dimensions': [1500, 1120], 'base_name': '1008669063', 'filename': '1008669063_00.jpg'}, 
    {'path': 'D://media/pr/product\\1\\0\\1008661118_00.jpg', 'dimensions': [500,   448], 'base_name': '1008661118', 'filename': '1008661118_00.jpg'}, 
    {'path': 'D://media/pr/product\\1\\0\\1008668062_00.jpg', 'dimensions': [1500, 1120], 'base_name': '1008668062', 'filename': '1008668062_00.jpg'}, 
    {'path': 'D://media/pr/product\\1\\0\\100653067_00.jpg',  'dimensions': [671,   900], 'base_name': '100653067',  'filename': '100653067_00.jpg'}
]