Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > список структур


Автор: mrgloom 13.3.2013, 11:19
написал такой код

Код

def get_best_n(img_path, db_dir,n=10,types = ('*.jpg','*.tif','*.png')):
    os.chdir(db_dir)
    
    files_grabbed = []
    for files in types:
        files_grabbed.extend(glob.glob(files))
    
    hist_list=[]
    for names in files_grabbed:
        full_path= db_dir+'\\'+names
        src = cv.LoadImage(full_path, cv.CV_LOAD_IMAGE_COLOR)
        hist_list.append(compute_histogram_rgb(src))
    
    score_list=[]
    img= cv.LoadImage(img_path, cv.CV_LOAD_IMAGE_COLOR)
    hist= compute_histogram_rgb(img)
    for h in hist_list:
        score_list.append(cv.CompareHist(hist, h, cv.CV_COMP_CORREL))
    score_list.sort()
    return score_list



мне необходимо как то вместе соединить имена изображений из files_grabbed и score_list, т.е. получиться список структур(?), а потом отсортировать по score_list и взять первые n и вывести их имена.

Автор: Backward 14.3.2013, 02:45
Для группировки списков есть функция zip.
Код

from operator import itemgetter
...
def get_best_n(img_path, db_dir,n=10,types = ('*.jpg','*.tif','*.png')):
    ...
    return sorted(zip(files_grabbed, score_list), key=itemgetter(1))

По поводу кода: как-то у Вас все слишком прямолинейно и ресурсоемко
Предлагаю такой вариант:
Код

import fnmatch, os, re
from itertools import *
from operator import itemgetter

def locate(pattern="*.*", root=os.curdir, recursive=True):
    if isinstance(pattern, str):
        pattern = pattern.split(";")
    pattern = re.compile("|".join(map(fnmatch.translate, pattern)), re.I).match

    root = os.path.abspath(root)

    if recursive:
        for path, dirs, files in os.walk(root):
            for filename in ifilter(pattern, files):
                yield os.path.join(path, filename)
    else:
        for filename in ifilter(pattern, os.listdir(root)):
            yield os.path.join(root, filename)

def compare_hist(standard, img_files):
    img= cv.LoadImage(standard, cv.CV_LOAD_IMAGE_COLOR)
    standard = compute_histogram_rgb(img)

    for path in img_files:
        img = cv.LoadImage(path, cv.CV_LOAD_IMAGE_COLOR)
        hist = compute_histogram_rgb(img)
        yield path, cv.CompareHist(standard, hist, cv.CV_COMP_CORREL)

def get_best_n(img_path, db_dir, n=10, types = ('*.jpg','*.tif','*.png')):
    score = compare_hist(img_path, locate(types, db_dir))
    return sorted(score, key=itemgetter(1))[:n]

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)