Задача Edabit не показывает правильный результат - PullRequest
0 голосов
/ 19 февраля 2020

Я делаю простую задачу, которая требует сортировки списка по результату выражения и запускаю этот код:

   def sort_by_answer(lst):
        ans = []
        dict = {}
        for i in lst:
            if 'x' in i:
                i = i.replace('x', '*')
            dict.update({i: eval(i)})
        dict = {k: v for k, v in sorted(dict.items(), key=lambda item: item[1])}
        res = list(dict.keys())
        for i in res:
            if '*' in i:
                i = i.replace('*', 'x')
                ans.append(i)
            else:
                ans.append(i)
        return ans

Это проверяет, но сайт, для которого я делаю этот тест (вот ссылка на задание (https://edabit.com/challenge/9zf6scCreprSaQAPq) говорит мне, что мой список отсортирован неправильно, что это, может кто-нибудь помочь мне улучшить этот код или что-то, чтобы он работал в каждом случае-сценарии?

PS

if 'x' in i:
      i = i.replace('x', '*')

Это сделано для того, чтобы я мог использовать функцию eval, но на входе сайта есть «x» вместо «*» в их списках.

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Я не думаю, что это проблема с вашим кодом, возможно, они используют что-то более старое, чем 3.6, и это портит порядок диктов. Кортеж будет безопаснее.

def sort_by_answer(lst):
    string = ','.join(lst).replace('x','*')
    l = string.split(',')
    d = [(k.replace('*','x'), eval(k)) for k in l]
    ans = [expr for expr, value in sorted(d, key = lambda x: x[1])]
    return ans

enter image description here

РЕДАКТИРОВАТЬ : @ Ch3steR ответ больше pythoni c:

def sort_by_answer(lst):
    return sorted(lst, key= lambda x: eval(x.replace('x','*')))
1 голос
/ 19 февраля 2020

Вы можете попробовать это. Но использование eval опасно для ненадежных строк.

In [63]: a=['1 + 1', '1 + 7', '1 + 5', '1 + 4']

In [69]: def evaluate(_str):
    ...:     return eval(_str.replace('x','*'))

output

In [70]: sorted(a,key=evaluate)
Out[70]: ['1 + 1', '1 + 4', '1 + 5', '1 + 7']

In [71]: sorted(['4 - 4', '2 - 2', '5 - 5', '10 - 10'],key=evaluate)
Out[71]: ['4 - 4', '2 - 2', '5 - 5', '10 - 10']

In [72]: sorted(['2 + 2', '2 - 2', '2 x 1'],key=evaluate)
Out[72]: ['2 - 2', '2 x 1', '2 + 2']
...