как объединить два списка с соответствующими значениями - PullRequest
1 голос
/ 21 апреля 2020

Итак, у меня есть два списка

a_List = [24.6781, 23.4512, 26.4623, 16.9619, 17.7685]
a_List2 = [3000.0, 500.0, 900.0, 900.0, 3000.0]

, где я хочу, чтобы значения a_List2 были подключены к a_List для получения желаемого выхода

1-3000 2-900 3-3000 4-500 5-900

Где позиция 3 имеет наибольшее значения a_List2 и позиции 4 имеют наименьшее значение a_List2, в основном связывающее два списка с их соответствующими значениями, сохраняя при этом правильные индексы a_List, имейте в виду, что положение значений может отличаться.

значение 26.4623 является самым высоким значением в a_List, поэтому оно должно быть связано с самым высоким значением в a_List2, которое составляет 3000

, значение 24,6781 является вторым по величине, поэтому оно должно быть связано со вторым по величине значением в a_List2, которое равно 3000

значение 23,4512 является третьим по величине, поэтому его следует подключить к третьему по величине значению в a_List2, равному 900

и т. Д.

, тогда мне нужно распечатайте связанные значения из a_List2 в правильном порядке индексов a_List

        for i in range(routers):
            a_dict.update({max(a_list) : max(a_list2)})
            router_list.remove(max(a_list2))
            a_list.remove(max(a_list))
        for x in a_dict.values():
            other_count+=1
            print(str(other_count)+"-"+str(int(x)), end= " ")
a_dict = {}
routers = 5 since we have 5 routers in this particular case

, что даст мне полу правильный вывод

1-3000 2-3000 3-900 4-900 5-500 

, но он не сохраняет структуру, если a_List - то, что мне нужно drawn example of what I want to achieve

Также не разрешается использовать любые встроенные python Функция sort ().

1 Ответ

1 голос
/ 21 апреля 2020

Что, я думаю, вы спрашиваете

Учитывая два списка одинаковой длины, как я могу отсортировать один, используя значения другого? Например:

to_show = ['a', 'b', 'c', 'd']
to_sort = [100, 200, -50, 700]
assert MAGIC() == ['c', 'a', 'b', 'd']

Как go об этом

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

>>> [b for a, b in sorted(zip(to_sort, to_show))]

«умная» версия этого может выглядеть следующим образом:

>>> zip(*sorted(zip(to_sort, to_show)))[1]
('c', 'a', 'b', 'd')

Как это работает

Это делает пару вещей, сначала группирует два списка, используя zip

>>> zip(to_sort, to_show)
[(100, 'a'), (200, 'b'), (-50, 'c'), (700, 'd')]

, затем сортирует эти значения. Python сортирует кортежи на основе первого, затем второго, затем третьего и т. Д. c. Это означает, что мы сначала сортируем по to_sort и разрываем связи на основе to_show (без связи с нашими данными).

>>> sorted(zip(to_sort, to_show))
[(-50, 'c'), (100, 'a'), (200, 'b'), (700, 'd')]

В нашей умной версии мы вызываем zip(* ...), чтобы "распаковать", что вернуть данные в два списка:

>>> zip(*sorted(zip(to_sort, to_show)))
[(-50, 100, 200, 700), ('c', 'a', 'b', 'd')]

и захватить второй список, to_show (теперь отсортировано), используя индекс списка:

>>> zip(*sorted(zip(to_sort, to_show)))[1]
('c', 'a', 'b', 'd')

Альтернативный подход с использованием key=

>>> [v for i, v in sorted(enumerate(to_show), key=lambda i_v: to_sort[i_v[0]])]
['c', 'a', 'b', 'd']

Вы можете предпочесть использовать аргумент ключевого слова key для sort или sorted. Цель состоит в том, чтобы сказать «когда вы сортируете элемент 1 из to_show, просто посмотрите вместо него to_sort». Для этого мы включим индекс, а затем удалим его.

Мы используем enumerate, чтобы дать нам индекс со значением

>>> sorted(enumerate(to_show), key=lambda i_v: to_sort[i_v[0]])
[(2, 'c'), (0, 'a'), (1, 'b'), (3, 'd')]

и можем затем следовать тому же обработка, как указано выше (zip или понимание) для извлечения значения (на этот раз индекс 0 вместо 1).

Обратите внимание, что нет функции нижеуказанной формы (т.е. игнорирование индексов )

>>> sorted(to_show, key=magic(to_sort))

, который может существовать, при поиске значений от to_show до to_sort возникнут проблемы с дублирующимися значениями в to_show.

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