Python: сортировка массива возвращает неинтуитивный порядок - PullRequest
0 голосов
/ 02 октября 2018

У меня есть два входа и мой выход

Sorted_Array = ['Historic Rate', 'Overnight', '1M', '3M', '6M', '1Y', '2Y', '3Y', '4Y', '5Y', '6Y', '7Y', '8Y', '9Y', '10Y', '12Y', '15Y']

Input = ['6M', '2Y', '7Y', '1Y']

Output = ['7Y', '1Y', '6M', '2Y']

вывод не интуитивен, он должен быть

Actual_Output = ['6M','1Y','2Y','7Y']

код, который я использую:

Ouput = [x for _, x in sorted(zip(Sorted_Array,Input), key=lambda pair: pair[0])]
print(Output)

Кто-нибудь может увидеть, где это пошло не так?

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

sorted(zip(Sorted_Array,Input), key=lambda pair: pair[0]) отсортировать результат по ключу, первому члену пары, из которого вы извлекли второго члена

>>>> Output = [x for x in sorted(zip(Sorted_Array,Input), key=lambda pair: pair[0])]
>>>> print(Output)
[('1M', '7Y'), ('3M', '1Y'), ('Historic Rate', '6M'), ('Overnight', '2Y')]
>>>> Output = [x for _, x in sorted(zip(Sorted_Array,Input), key=lambda pair: pair[0])]
>>>> print(Output)
['7Y', '1Y', '6M', '2Y']

вам необходимо изменить ключ на pair[1]

>>>> Output = [x for _, x in sorted(zip(Sorted_Array,Input), key=lambda pair: pair[1])]
>>>> print(Output)
['1Y', '2Y', '6M', '7Y']
0 голосов
/ 02 октября 2018

В настоящее время вы соединяете элементы Input с 4 первыми элементами Sorted_Array:

>>> temp = list(zip(Sorted_Array, Input)))
[('Historic Rate', '6M'), ('Overnight', '2Y'), ('1M', '7Y'), ('3M', '1Y')]

Затем вы сортируете с помощью лямбда-функции на основе первых элементов этих кортежей.Это в следующем порядке:

>>> sorted(temp, key=lambda pair: pair[0])
[('1M', '7Y'), ('3M', '1Y'), ('Historic Rate', '6M'), ('Overnight', '2Y')]

Теперь должно быть ясно, как вы получите результат, который у вас есть.Сортировать по порядку элементов в Sorted_Array можно с помощью функции index:

>>> sorted(Input, key=lambda item: Sorted_Array.index(item))
['6M', '1Y', '2Y', '7Y']

Примечание: функция index вызывает исключение, если элемент отсутствует всписок.

0 голосов
/ 02 октября 2018

в python 2.x:

def dist(x,y):
     return sorted_array.index(x) - sorted_array.index(y)

output = sorted(input, cmp=dist)

В python 3.x:

def func(input):
    output = input
    for i in range(len(output)):
         try:
            output[i] = sorted_array.index(output[i])
         except Exception as e:
            output[i] = len(sorted_array)+1
    return output

output = [ x for x,y in sorted((input,func(input),key = lambda k: k[1])]

это должно работать

...