Как написать однострочник со списком, который зависит от сравнения и хранения значений? - PullRequest
1 голос
/ 05 мая 2019

у меня lines = ["222,333", ...] Как переписать следующее:

res = 0
result = []
for line in lines:
   body, exp = line.split(',')
   logr = math.log(int(body), int(exp))
   if logr > res:
       res = logr
       result = [int(body), int(exp)]

в одну строку?

Я пытаюсь что-то вроде

result = [math.log(int(d.split(',')[0]), int(d.split(',')[1])) for d in lines]

Но после этого я застрял. Как сравнить мой math.log с предыдущим результатом и, если он больше, записать его в какую-нибудь переменную?

Я ожидаю, что результат будет "333,444" или что-то подобное.

1 Ответ

3 голосов
/ 05 мая 2019

Однострочник для result и однострочник для res:

result = max([[*map(int,d.split(','))] for d in lines], key=lambda p: math.log(*p))
res = math.log(*result)

Тада ?

Что это за магия?

Нужно понять, что result окажется только одним списком длины два: [body, exp]. И этот список решается logr > res - ключом , чтобы сортировать, подразумевая использование min, sorted, max или подобного.

Проблема с немедленной оценкой журнала, как показано в попытке в вопросе, заключается в том, что мы теряем значения, полученные из split(', '). Но нам нужны эти значения для result! Вместо этого сохраните значения, сначала определите правильную пару, а затем просмотрите журнал.

Теперь до однострочников. Первая часть понимания довольно проста.

[[*map(int,d.split(','))] for d in lines]

Создает список списков проанализированных строк.

["111,222", "333,444", "555,666"]  # before (lines)
[[111, 222],
 [333, 444],
 [555, 666]]    # after (list comp.)

Затем мы выбираем пару, которая имеет наивысший журнал. Другими словами, мы берем max, сравнивая по ключу key=lambda p: math.log(*p) (т.е. сравниваем по журналу).

(Если вам интересно, что делает звездочка, она распаковывает данную итерацию (см. Что означает оператор звезды? для получения дополнительной информации). В данном конкретном случае math.log(*p) - это то же самое как math.log(p[0], p[1]).)

Как только мы выбрали наш результат, мы снова добавляем его в math.log для вычисления res.

И все хорошо кончается.

...