Рубрики
Без рубрики

Сортировка списка на основе значений из другого списка

Общая проблема, которую люди часто бегают против в Python, понимают способ сортировки одного списка на основе значений в другом. Для этого есть много решений, но я выберу три основных метода, один из которых использует хорошо понятые встроенные функции Python, такие как zip () и сортируют (). Один из них будет использовать словарь … сортировка списка на основе значений из другого списка Подробнее »

Автор оригинала: David Yeoman.

Общая проблема, которую люди часто бегут против в Python, это понимание метода Сортировать один Список на основе ценностей в другом.

Для этого есть много решений, но я выберет три основных метода, один из которых использует хорошо понявную Встроенные функции Python такие как zip () и отсортировано () Отказ Один будет использовать тип данных словаря, и, наконец, я введем импортированный модуль под названием more_itertools С его sort_together () метод.

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

Для целей этой демонстрации я предполагаю, что у нас небольшой список акций из газеты, который запасет международные продукты питания, и список, содержащий количество каждого предмета. Проблема, которую мы решаем, – это то, как лучше отсортировать список предметов акций, заказанные по возрастанию акций, основанные на списке счетчиков акций.

Вот начальные данные, которые мы будем использовать в каждом методе:

stock_items = ['Escargot', 'Nori', 'Xacuti', 'Rouladen', 'Falafel', 'Tabbouleh', 'Icaco']
stock_count = [12, 5, 8, 18, 3, 10, 4]
# Problem: We want a list of stock items sorted from lowest stock number to highest stock number

Сортировка с использованием функций ZIP () и отсортированных ()

В Python, zip () Функция требует нескольких поручений и «застегивает их вместе как кортежи , сформированные с использованием первого итератора от каждого передового, то второй до максимально короткого ИТЕРИТЕЛЬНО завершено. Вот пример. У нас есть три иракта, А , B и C . Отказ

a = ('F', 'x', 'r', 'c', 'e')

b = ('i', 't', ' ', 'a', 'm')

c = ('n', 'e', 'A', 'd', 'y')

x = list(zip(a, b, c))

# Result

[('F', 'i', 'n'), ('x', 't', 'e'), ('r', ' ', 'A'), ('c', 'a', 'd'), ('e', 'm', 'y')]

Затем мы можем использовать цикл для очистки списка на молнии:

for tup in x:
     for i in tup:
        print(i, end='')

# Result

Finxter Academy

отсортировано () Функция возвращает отсортированный список указанного объекта ITERABLE. Вот пример, используя отсортировано () на неупорядоченном кортеж :

y = ('a', '3', '6', 'f', '1', 'd', '4', 'b', '2', 'c', '5', 'e')

z = sorted(y)

print(z)

# Result

['1', '2', '3', '4', '5', '6', 'a', 'b', 'c', 'd', 'e', 'f']

Поэтому, как только мы понимаем эти функции, мы можем применить их к нашей проблеме. Сначала я приложу довольно давно обнаженный подход к шагу через этапы, то я покажу более краткую версию.

Пример 1 – длинная версия zip () и отсортирована ()

# Example 1: Zip - Sorted

stock_items = ['Escargot', 'Nori', 'Xacuti', 'Rouladen', 'Falafel', 'Tabbouleh', 'Icaco']

stock_count = [12, 5, 8, 18, 3, 10, 4]

# Problem: We want a list of stock items sorted from lowest stock count to highest stock count

zipped_list = zip(stock_count, stock_items)
# Returns zip object 

sorted_list = sorted(zipped_list)
# Returns [(3, 'Falafel'), (4, 'Icaco'), (5, 'Nori'), (8, 'Xacuti'), (10, 'Tabbouleh'), (12, 'Escargot'), (18, 'Rouladen')]

new_list = [value[1] for value in sorted_list]

print(new_list)

# Result

['Falafel', 'Icaco', 'Nori', 'Xacuti', 'Tabbouleh', 'Escargot', 'Rouladen']

Итак, мы получили правильный ответ. В этом методе мы проходили через три шага, а затем команда печати, настолько длинно, но полезно для людей, которые могут понадобиться пройти через процесс логичным и рассмотренным образом.

Теперь давайте консолидируем эти шаги в одна линия кода, включая Печать команда.

Пример 2 – Краткая версия ZIP () и отсортирована ()

# Example 2: Concise Zip - Sorted

stock_items = ['Escargot', 'Nori', 'Xacuti', 'Rouladen', 'Falafel', 'Tabbouleh', 'Icaco']

stock_count = [12, 5, 8, 18, 3, 10, 4]

# Problem: We want the stock items sorted from lowest stock to highest stock numbers

print([stock_items for _, stock_items in sorted(zip(stock_count, stock_items))])

# Result

['Falafel', 'Icaco', 'Nori', 'Xacuti', 'Tabbouleh', 'Escargot', 'Rouladen']

Обратите внимание на использование подчеркивание В этой строке кода. У подчеркивания много использует в Python, и в этом использовании это в режиме «Мне все равно». Акции акций – единственное значение, которое нам нужно, а не счетчик акций, поэтому вместо того, чтобы использовать синтаксис « Stock_Items для Stock_Count, Stock_Value в сортировке ...». «Мы просто используем подчеркивание, как показано на рисунке.

Сортировка с использованием словаря DataType

В этом примере мы будем Присоединяйтесь к двум спискам как словарь , используя Stock_Count значение как ключ и Stock_Items Имя как значение. Теперь я только включал этот метод, потому что у нас нет дублирующих чисел в складе. Я уверен, что все понимают, что словари Python не могут иметь Дубликат Ключи. Если у вас есть дубликаты, все еще есть способ сделать это, используя модуль коллекций и defaultdict () метод, который эффективно делает Словарь списков, но, честно говоря, работа, связанная с использованием defaultdict Просто к Сортировать Из двух списков в словаре, затем обратно в список делает издеваться над методом. Тем не менее, если бы вы хотели бы получить кодирующую проблему, я предлагаю вам попробовать, как это отличная практика. Я положил ссылку на коллекции и defaultdict () информация в конце этой статьи.

Сказав словарь, мы тогда используем отсортировано () Метод учился ранее, используя Stock_Count ценность как ключ Отказ

Наконец, мы извлекаем только Stock_Items Имя и Создать список Отказ

# Example 3: Dictionary_sort

stock_items = ['Escargot', 'Nori', 'Xacuti', 'Rouladen', 'Falafel', 'Tabbouleh', 'Icaco']

stock_count = [12, 5, 8, 18, 3, 10, 4]

# Problem: We want the stock items sorted from lowest stock to highest stock numbers

# Join two lists as a dictionary
new_dict = {stock_count[i]: stock_items[i] for i in range(len(stock_items))}
# Returns {12: 'Escargot', 5: 'Nori', 8: 'Xacuti', 18: 'Rouladen', 3: 'Falafel', 10: 'Tabbouleh', 4: 'Icaco'}

# Sort based on value
sort_dict = {k: v for k, v in sorted(new_dict.items(), key=lambda item: item[0])}
# Returns {3: 'Falafel', 4: 'Icaco', 5: 'Nori', 8: 'Xacuti', 10: 'Tabbouleh', 12: 'Escargot', 18: 'Rouladen'}

# Create a list of the sorted stock items
print([v for k, v in (sort_dict.items())])

# Result

['Falafel', 'Icaco', 'Nori', 'Xacuti', 'Tabbouleh', 'Escargot', 'Rouladen']

Представляем модуль Python Itertools и третья сторона FORE_ITERTOOLS

Если вы делаете много работы с Python Iterables, вы должны вам расследовать F, вы делаете много работы с Python Iterables, вы должны себе расследовать замечательный модуль Python Module в Эта ссылка Отказ Это позволяет вам составить эффективные памяти инструменты для широкого спектра довольно сложных случаев использования при работе с повторными документами.

Чтобы расширить это, у нас есть дополнительный сторонний модуль, называемый, достаточно соответствующим образом, more_itertools расположена здесь Отказ

В этом примере мы импортируем метод под названием sort_together () содержащийся в more_itertools модуль И мы будем применить его к нашей проблеме. Он делает то же самое, что и мы показали с нашими предыдущими примерами, но в очень эффективной памяти и питоновом пути. Я думаю, что вы увидите разницу в лаконичном кодексе!

# Example 4: More_Itertools

from more_itertools import sort_together

stock_items = ['Escargot', 'Nori', 'Xacuti', 'Rouladen', 'Falafel', 'Tabbouleh', 'Icaco']

stock_count = [12, 5, 8, 18, 3, 10, 4]

# Problem: We want the stock items sorted from lowest stock to highest stock numbers

print(sort_together([stock_count, stock_items])[1])

# Result

('Falafel', 'Icaco', 'Nori', 'Xacuti', 'Tabbouleh', 'Escargot', 'Rouladen')

Очень приборное решение для нашей проблемы.

Теперь, если вы еще не отработали, почему я использовал такой странный список международных продуктов для моего примера, давайте покажем вам окончательный кусок кода для современной статьи, добавив две строки к первому примеру кода, мы начали статью с участием. Честно говоря, я сделал это, чтобы быть уверенным, что каждый пример кода дал желаемый результат, быстро сканируя знакомое слово, а не в трудоустройстве через два списка.

# Example 1: Zip - Sorted

stock_items = ['Escargot', 'Nori', 'Xacuti', 'Rouladen', 'Falafel', 'Tabbouleh', 'Icaco']

stock_count = [12, 5, 8, 18, 3, 10, 4]

# Problem: We want a list of stock items sorted from lowest stock number to highest stock number

# .  .  .  .

new_list = [value[1] for value in sorted_list]
print(new_list)

for i in new_list:
    print(i[0], end='')

# Result

FINXTER

В итоге

Мы открыли эту статью, представляя проблему необходимости сортировки одного списка на основе значений в другом. Мы использовали пример, в котором первый список были на нашем международном DELI, а второй список был последним подсчетом этих предметов. Наша цель состояла в том, чтобы вернуть список предметов на складе, начиная с самых низких чисел запасов и подниматься до самого высокого.

Мы представили функции Python zip () и отсортировано () Перед нанесением их в два примера. В первом примере мы проходили по шагам, связанным с использованием двух функций перед консолидацией кода в одноклассник Отказ

Затем мы посмотрели на использование типа данных словаря, на понимании того, что такое корпус использования работает только при использовании значений, которые будут использоваться в качестве клавиш в словаре, не имеют дупликатов.

Если у вас есть дублирующие ключи, нам нужно исследовать модуль коллекций в Python и использовать defaultdict () Способ создания словаря списков. Конечно, не элегантный, эффективный память, или экономичное решение для нашей проблемы, но тем не менее интересную проблему кодирования. Детали могут быть найдены здесь Отказ

Наконец, мы упомянули модуль Python Itertools Перед введением своего стороннего двоюродного брата more_itertools и его метод sort_together () Отказ

Я доверяю эту статью было полезным и большим спасибо за чтение!

Оригинал: “https://blog.finxter.com/sorting-a-list-based-on-values-from-another-list/”