Не могу правильно вызвать функцию с сортировкой в ​​Python - PullRequest
0 голосов
/ 26 апреля 2020

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

currencies=[['hryvna', '1 hryvna', '2005', '0.036'], ['dollar', '1 dollar', '2006', '1'], ['euro', '1 euro', '2007', '1.08'], ['Belarusian ruble', '1 Belarusian ruble', '2008', '0.39'], ['pound', '1 pound', '2009', '1.23']]
def atribute_choice():
    atribute=int(input("""Choose the atribute:
    1 - Currency name;
    2 - Currency denomination;
    3 - Currency year of release;
    4 - Currency rate to the dollar\n"""))
    atribute=atribute-1
    return atribute
def sorting(elem):
    return elem[atribute_choice()]
def currencies_sorting():
    currencies.sort(key=sorting)


currencies_sorting()
print (currencies)

Ответы [ 3 ]

0 голосов
/ 27 апреля 2020

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

Таким образом, вы хотите передать это значение в sorting, но у вас его нет в месте, где sorting вызывается (внутренне, методом sort). Вы должны "связать" это; мы могли бы сделать это элегантно с functools.partial из стандартной библиотеки:

from functools import partial

def sorting(choice, elem):
    return elem[choice]

def currencies_sorting():
    attribute = attribute_choice()
    currencies.sort(key=partial(sorting, attribute))

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

from operator import itemgetter

def currencies_sorting():
    currencies.sort(key=itemgetter(attribute_choice()))

Или вы можете создать его самостоятельно, используя lambda, как показано в другом ответе.

0 голосов
/ 27 апреля 2020

Причина, по которой он продолжает запрашивать ввод, заключается в том, что вы запрашиваете ввод для каждой строки в вашем 2D-списке.

Если вы хотите задать его только один раз, измените код следующим образом:

currencies = [['hryvna', '1 hryvna', '2005', '0.036'],
['dollar', '1 dollar', '2006', '1'],
['euro', '1 euro', '2007', '1.08'],
['Belarusian ruble', '1 Belarusian ruble', '2008', '0.39'],
['pound', '1 pound', '2009', '1.23']]

def atribute_choice():
    atribute = int(input("""Choose the atribute:
    1 - Currency name;
    2 - Currency denomination;
    3 - Currency year of release;
    4 - Currency rate to the dollar\n"""))
    atribute = atribute - 1
    return atribute

def sorting(elem):
    a = elem[attribute]
    return a

def currencies_sorting():
    currencies.sort(key=sorting)


attribute = atribute_choice()
currencies_sorting()
print(currencies)
0 голосов
/ 27 апреля 2020

Вы можете сделать это так:

currencies=[['hryvna', '1 hryvna', '2005', '0.036'], ['dollar', '1 dollar', '2006', '1'], ['euro', '1 euro', '2007', '1.08'], ['Belarusian ruble', '1 Belarusian ruble', '2008', '0.39'], ['pound', '1 pound', '2009', '1.23']]
def atribute_choice():
    atribute=int(input("""Choose the atribute:
    1 - Currency name;
    2 - Currency denomination;
    3 - Currency year of release;
    4 - Currency rate to the dollar\n"""))
    atribute=atribute-1
    return atribute

def currencies_sorting():
    choice = atribute_choice()
    currencies.sort(key=lambda x: x[choice])


currencies_sorting()
print (currencies)

Также вы можете найти больше информации о сортировке здесь

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