Python 列表推导 - 访问最后创建的元素
在一个列表推导式中,能否访问到之前生成的元素呢?
我正在做一些简单的加密工作。给定一个任意大的整数作为密钥,一个初始化值,以及一组要加密的元素。我需要把每个元素和前一个加密后的元素还有密钥进行异或运算。下面的循环可以实现这个功能。
previous = initialization_value
cipher = []
for element in message:
previous = element ^ previous ^ key
cipher.append(previous)
我觉得应该可以把这个转换成列表推导式,但我不太确定怎么处理初始值和如何访问之前生成的值。这样做可能吗?如果可以的话,列表推导式应该是什么样的?
9 个回答
4
从Python 3.8开始,新增了一种叫做赋值表达式的功能,这个功能可以用来实现一种列表推导式,它能记住在循环中最后一个值。
previous = initialization_value
cipher = [previous := element ^ previous ^ key for element in message]
如果你喜欢把所有东西写在一行里,可以把previous
初始化为一个单元素的列表,然后用and
运算符把它丢掉,让列表推导式来接管:
cipher = [previous := initialization_value] and [previous := element ^ previous ^ key for element in message]
7
作为一个生成器:
def cypher(message, key, seed):
for element in message:
seed = element ^ seed ^ key
yield seed
list(cypher(message, key, initial_seed))
26
用列表推导式来做这个事情并不是一个很好的选择。理解列表推导式的最好方式是把它看作是 map
和 filter
的替代品。换句话说,当你需要对一个列表进行以下操作时,就可以使用列表推导式:
把列表中的元素作为输入,进行某种计算(比如把元素平方)
根据某些条件,去掉列表中的一些元素
这些操作的共同点是,它们每次只处理一个列表元素。这是一个很好的经验法则;即使理论上你可以把你展示的代码写成列表推导式,但那样会显得很别扭,也不符合 Python 的风格。