我有一个列表
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 ]
它一直在回我
[<generator object <genexpr> at 0x0000000003704048>, <generator object <genexpr> 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]
答案 0 :(得分:1)
您的外部列表理解具有嵌套生成器表达式:
[
(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']
您可以使用itertools.product()
utility funcnion生成配对:
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