2017-04-19 76 views
0

因此,我试图将大量的数据,100万以上的图像分类到唯一相关的媒体中。Python比较和构建字典的清单列表

为了达到这个目的,我创建了一个字典结构,它包含了这些图像的所有数据。这部分没什么问题,但我很努力地只把相关的图片加入到一个新的精简列表中。下面是一些读入脚本的示例数据。

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}} 
+0

你能告诉我们'img_dict'的conetnts? – Kevin

+0

好的,我现在编辑这个问题。 – Grinch91

回答

1

有许多方法可以做到这一点,但我认为重要的核心思想是通过他们的“基本名称”,让你组织项目不必遍历所有100万个物品,找到需要比较的物品。 “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'} 
] 
+0

明天我会试着将它实现到我的代码中。感谢您的建议。 – Grinch91

+0

我在运行一个大样本数据时出现以下错误:filename,raw_dimensions,path = line.strip()。split(“|”) ValueError:解压缩的值太多(预计3) – Grinch91

+0

我的代码假定输入文件中的每一行都恰好包含两个管道字符,每个管道字符都有一个空间。如果您有多于此行的行,或者您有任何空白行,则代码将在此时失败。 – Kevin