Сортировать список объектов по строковому атрибуту - PullRequest
0 голосов
/ 23 января 2019

Я сгенерировал много файлов изображений (PNG) в папке.У каждого есть имена, похожие на «img0.png», «img1.png», ..., «img123164971.png» и т. Д. Порядок этих изображений важен для меня, а числовая часть представляет порядок, в котором я должен их получить, прежде чемЯ добавляю их в html-форму.

Этот вопрос близко дает мне решение: Есть ли в Python встроенная функция для естественной сортировки строк?

Но я 'Я не совсем уверен, как включить его в мой конкретный код:

imagedata = list()
files_and_dirs = Path(imagefolder).glob('**/*')
images = [x for x in files_and_dirs if x.is_file() and x.suffix == '.png']

for image in images:
    imagedata.append("<img src='{0}/{1}' width='200'>".format(imagefolder, image.name))

Эти файлы, естественно, читаются буквенно-цифровым способом, но это не то, что я хочу.У меня есть ощущение, что я могу просто сделать функцию images = sort_function (images), но я не уверен, как именно.Я понимаю, что могу сделать это:

imagedata = list()
files_and_dirs = Path(barcodeimagefolder).glob('**/*')
images = [x.name for x in files_and_dirs if x.is_file() and x.suffix == '.png']
images = natural_sort(images)

for image in images:
    imagedata.append("<img src='{0}/{1}' width='200'>".format(imagefolder, image))

def natural_sort(l): 
    convert = lambda text: int(text) if text.isdigit() else text.lower() 
    alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ] 
    return sorted(l, key = alphanum_key)

Используя решение Марка Байерса в ссылке.Но позже мне понадобится список самих реальных изображений, и кажется избыточным иметь два списка, когда один из них содержит все данные в другом.Вместо этого я бы очень хотел отсортировать список файлов изображений по их имени, таким образом.Или еще лучше, прочитайте их из папки в таком порядке, если это возможно.Любой совет?

Редактировать: я изменил название, сделав его немного более сжатым и, надеюсь, все еще точным.

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Вы имеете в виду, что вы просто хотите отсортировать imagedata? Не красиво, но попробуйте:

imagedata.sort(key=lambda x : int(re.search('(\d+)', re.search('(src=\'.+\/)', x)[0])[0]))

Внутреннее регулярное выражение получает src='<something>/, а внешнее получает цифры в пределах <something>, предполагая, что <something> имеет префикс без цифр и суффикс без цифр.

0 голосов
/ 23 января 2019

Предполагая, что вы действительно хотите, чтобы вещи «естественно сортировались» строго по имени отдельного файла, а не по полному пути (например, так что «zzz / image01.png» предшествует «aaa / image99.png») , ( EDIT : Теперь я вижу из комментариев, что это не так ), один из способов сделать это - создать упорядоченный словарь, в котором ключами являются имена файлов и значения теги "", которые вы в конечном итоге создаете. Затем выполните естественную сортировку словарных ключей и верните список соответствующих значений.

Таким образом, используя простой список из 3 готовых файлов и добавляя поворот к исходной натуральной сортировке, функция:

import collections
import re

def files_with_natural_sort(l):
    convert = lambda text: int(text) if text.isdigit() else text.lower()
    alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ]
    return [ l[newkey] for newkey in sorted(l, key = alphanum_key) ]

original_files = ["folder_c/file9.png", "folder_a/file11.png", "folder_b/file10.png"]

image_dict = collections.OrderedDict()

for file in original_files:
    [folder, filename] = file.split('/')
    image_dict[filename] = '<img src="%s" width="200">' % file

sorted_keys = files_with_natural_sort(image_dict)
print(sorted_keys)

Это выводит:

['<img src="folder_c/file9.png" width="200">', '<img src="folder_b/file10.png"
    width="200">', '<img src="folder_a/file11.png" width="200">']

Можно обойти это, используя обычный словарь и играя со списком .keys () этого словаря. Но это все еще работает. Что касается попыток создать список файлов желаемого порядка по мере их прочтения, я полагаю, что вы могли бы сделать для этого некоторую причудливую сортировку пузырьков, но я бы не стал потеть. Если у вас нет миллионов файлов, я не вижу вреда в использовании нескольких списков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...