Сортировать список строк alphanumeri c - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть список строк, каждая из которых будет что-то вроде '; 2234661; E3006345_2234661_FRONT_Image_Container; \ n', которые мне нужно отсортировать. Каждая строка будет начинаться с точки с запятой и разных чисел, но мне нужно, чтобы все они были отсортированы в соответствии с углом изображения (например, FRONT, BACK, LEFT) в не алфавитном порядке после этого ранжирования: FRONT BACK LEFT RIGHT INGREDIENTS ИНСТРУКЦИЯ ПО ИНФОРМАЦИИ NUTRITION PRODUCT

Пример ввода:

[';2234661;PRODUCT;', ';2234661;FRONT;', ';2234661;LEFT;', ';2234661;RIGHT;', ';2234661;BACK;', ';2234661;INGREDIENTS;', ';2234661;NUTRITION;', ';2234661;INSTRUCTIONS;', ';2234661;INFO;']

Желаемый вывод

[';2234661;FRONT;', ';2234661;BACK;', ';2234661;LEFT;', ';2234661;RIGHT;', ';2234661;INGREDIENTS;', ';2234661;INSTRUCTIONS;', ';2234661;INFO;', ';2234661;NUTRITION;', ';2234661;PRODUCT;']

Вот мой код, основанный на решении аналогичной проблемы, которую я нашел здесь на бирже стека Тем не менее он возвращает ошибку «ValueError: подстрока не найдена

galleryImages = [';2234661;PRODUCT;', ';2234661;FRONT;', ';2234661;LEFT;', ';2234661;RIGHT;', ';2234661;BACK;', ';2234661;INGREDIENTS;', ';2234661;NUTRITION;', ';2234661;INSTRUCTIONS;', ';2234661;INFO;']

alphabet = 'FBLRINP'

newGallery = sorted(galleryImages, key=lambda word: [alphabet.index(c) for c in word])

print(newGallery)

Ответы [ 3 ]

1 голос
/ 14 февраля 2020
data = [';2234661;PRODUCT;', ';2234661;FRONT;', ';2234661;LEFT;', ';2234661;RIGHT;', ';2234661;BACK;', ';2234661;INGREDIENTS;', ';2234661;NUTRITION;', ';2234661;INSTRUCTIONS;', ';2234661;INFO;']
keys = ['FRONT', 'BACK', 'LEFT', 'RIGHT', 'INGREDIENTS', 'INSTRUCTIONS', 'INFO', 'NUTRITION', 'PRODUCT']

res = [key for x in keys for key in data if key.split(';')[2] == x]

Выход:

[';2234661;FRONT;', ';2234661;BACK;', ';2234661;LEFT;', ';2234661;RIGHT;', ';2234661;INGREDIENTS;', ';2234661;INSTRUCTIONS;', ';2234661;INFO;', ';2234661;NUTRITION;', ';2234661;PRODUCT;']
1 голос
/ 14 февраля 2020

Попробуйте это ..

>>> my_list = [';2234661;PRODUCT;', ';2234661;FRONT;', ';2234661;LEFT;', ';2234661;RIGHT;', ';2234661;BACK;', ';2234661;INGREDIENTS;', ';2234661;NUTRITION;', ';2234661;INSTRUCTIONS;', ';2234661;INFO;']

>>> my_sorting_logic  = ['FRONT', 'BACK', 'LEFT', 'RIGHT', 'INGREDIENTS', 'INSTRUCTIONS', 'INFO', 'NUTRITION', 'PRODUCT']

Сортировка по индексу ключа

>>> sorted(my_list, key = lambda x : my_sorting_logic.index(x.split(';')[2]))

Вывод:

[';2234661;FRONT;', ';2234661;BACK;', ';2234661;LEFT;', ';2234661;RIGHT;', ';2234661;INGREDIENTS;', ';2234661;INSTRUCTIONS;', ';2234661;INFO;', ';2234661;NUTRITION;', ';2234661;PRODUCT;']
0 голосов
/ 14 февраля 2020
my_list = [';2234661;PRODUCT;', ';2234661;FRONT;', ';2234661;LEFT;', ';2234661;RIGHT;', ';2234661;BACK;', ';2234661;INGREDIENTS;', ';2234661;NUTRITION;', ';2234661;INSTRUCTIONS;', ';2234661;INFO;']

# create a dictionary of the form {"FRONT": 0, "BACK": 1, …}
angle = { e: i for i, e in enumerate(['FRONT', 'BACK', 'LEFT', 'RIGHT', 'INGREDIENTS', 'INSTRUCTIONS', 'INFO', 'NUTRITION', 'PRODUCT']) }

my_list.sort(key=lambda x: angle[x.split(';')[2]], reverse=True)

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