Как сделать списочные представления более читабельными? - PullRequest
2 голосов
/ 24 октября 2019

У меня есть этот фрагмент кода ниже, и я думаю, что это довольно трудно понять, если вы новичок в Python.

Как бы я сделал его более читабельным для группы новичков в Python (студенты)

def right_inwrongplace(userGuess, number):
    correct_places = [True if v == number[i] else False for i, v in enumerate(userGuess)]
    g = [v for  i, v in enumerate(userGuess) if not correct_places[i]]
    n = [v for  i, v in enumerate(number) if not correct_places[i]]
    return len([i for i in g if i in n])

1 Ответ

2 голосов
/ 24 октября 2019

Вот несколько улучшений:

  • True if x else False - это просто bool(x) или, как вы уже сравниваете, просто это выражение, то есть v == number[i].
  • Поскольку вы получаете доступ к номеру по позиционному индексу, вы можете просто zip две последовательности.

Так что для первого вы получите:

correct_places = [x == y for x, y in zip(userGuess, number)]

Тот же аргументс zip относится к следующим двум понятиям (вы можете снова выполнить итерацию по исходной строке):

g = [x for x, y in zip(userGuess, number) if x != y]
n = [y for x, y in zip(userGuess, number) if x != y]

Учитывая, что это в основном одно и то же понимание два раза и что нам не нужно correct_places больше мы можем вместо этого делать следующее:

g, n = zip(*[(x, y) for x, y in zip(userGuess, number) if x != y])

Тогда вы можете sum вместо len:

return sum(x in n for x in g)

Таким образом, вы можете использовать следующий код:

g, n  = zip(*(xy for xy in zip(userGuess, num) if xy[0] != xy[1])
return sum(x in n for x in g)
...