如何使列表理解更具可读性?

时间:2019-10-23 21:19:16

标签: python python-3.x python-2.7 list list-comprehension

我在下面有这段代码,如果您不熟悉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 个答案:

答案 0 :(得分:2)

以下是一些改进:

  • 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)