2017-04-19 15 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

あり、これを行うにはいくつかの方法がありますが、私は基本的な核となるアイデアは、あなたのように彼らの「ベース名」でアイテムを整理することだと思います比較する必要があるものを見つけるために百万のアイテムすべてを反復する必要はありません。 "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

大きなサンプルサイズのデータ​​に対して実行すると、ファイル名、raw_dimensions、パス= line.strip()。split( "|") ValueError:アンパックする値が多すぎます(予想3) – Grinch91

+0

私のコードでは、入力ファイルのすべての行にちょうど2つのパイプ文字が含まれており、それぞれにはいずれかの側にスペースがあるものとします。それ以上の行がある場合、または空白行がある場合、その時点でコードは失敗します。 – Kevin

関連する問題