python 返回函数无法理解_Python-结果返回生成器,而不是列表(理解)

我有一个清单

x = ['1100000', '0110000', '0011000', '0001100', '0000110', '0000011']

我想对整个数组的每个元素进行按位XOR操作,所以我定义了一个xor函数,如下所示

def x_o_r(val) :

return "".join([ str(int(x) ^ int(y)) for (x,y) in val])

val将会是zip(list('1100000'), list('0110000')]这样,等等。

所以我定义了如下的理解

[(x_o_r(z) for z in zip(list(a), list(b))) for a in x for b in x ]

它一直在回我

[ at 0x0000000003704048>, at 0x0000000003704090>,.....]

我不明白,我有一个[]结果。

我什至试图让单个生成器列出(也尝试过list()函数)

[([x_o_r(z)] for z in zip(list(a), list(b))) for a in x for b in x ]

有人能指出我的错误吗?

编辑

好吧,我接受了MArtijn的建议并通过以下表达式解决了它

["".join([str(int(s) ^ int(d)) for (s,d) in zip(list(a), list(b))]) for a in x for b in x]

解决方案

您的外部列表理解具有嵌套的生成器表达式:

[

(x_o_r(z) for z in zip(list(a), list(b)))

for a in x for b in x

]

注意(expr for target_list in expr)那里的部分;这些是您在输出中看到的生成器对象。

也许也使列表理解:

[[x_o_r(z) for z in zip(list(a), list(b))] for a in x for b in x]

但是,如果您想将该函数应用于中的每对元素x,则可能需要:

[x_o_r(zip(list(a), list(b))) for a in x for b in x]

演示:

>>> [x_o_r(zip(list(a), list(b))) for a in x for b in x]

['0000000', '1010000', '1111000', '1101100', '1100110', '1100011', '1010000', '0000000', '0101000', '0111100', '0110110', '0110011', '1111000', '0101000', '0000000', '0010100', '0011110', '0011011', '1101100', '0111100', '0010100', '0000000', '0001010', '0001111', '1100110', '0110110', '0011110', '0001010', '0000000', '0000101', '1100011', '0110011', '0011011', '0001111', '0000101', '0000000']

from itertools import product

[x_o_r(zip(list(a), list(b))) for a, b in product(x, repeat=2)]

接下来,调整x_o_r函数以获取两个输入,并可能使用更优化的整数方法:

def x_o_r(a, b):

return format(int(a, 2) ^ int(b, 2), '08b')

[x_o_r(a, b) for a, b in product(x, repeat=2)]

在速度方面,后一个版本将旧的方法从水里吹了出来:

>>> timeit.timeit('[x_o_r(zip(list(a), list(b))) for a in x for b in x]', 'from __main__ import x_o_r, x', number=10000)

3.6057410949724726

>>> timeit.timeit('[x_o_r_new(a, b) for a, b in product(x, repeat=2)]', 'from __main__ import x_o_r_new, x, product', number=10000)

0.6972788329585455

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值