Python-结果返回生成器而不是列表(理解)

Python-结果返回生成器而不是列表(理解),python,python-3.x,generator,list-comprehension,Python,Python 3.x,Generator,List Comprehension,我有一张单子 x = ['1100000', '0110000', '0011000', '0001100', '0000110', '0000011'] 我想对整个数组中的每个元素执行逐位异或运算 我定义了一个xor函数,如下所示 def x_o_r(val) : return "".join([ str(int(x) ^ int(y)) for (x,y) in val]) [(x_o_r(z) for z in zip(list(a), list(b))) for a in x

我有一张单子

x = ['1100000', '0110000', '0011000', '0001100', '0000110', '0000011']
我想对整个数组中的每个元素执行逐位异或运算 我定义了一个xor函数,如下所示

def x_o_r(val) :
    return "".join([ str(int(x) ^ int(y)) for (x,y) in val])
[(x_o_r(z) for z in zip(list(a), list(b))) for a in x for b in x ]
这里的val应该是
zip(list('1100000')、list('011000')]
等等

因此,我将理解定义如下

def x_o_r(val) :
    return "".join([ str(int(x) ^ int(y)) for (x,y) in val])
[(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>,.....]
有人能指出我的错误吗

编辑

好吧,我接受了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中的expr for target_list)
部分;这些是您在输出中看到的生成器对象

也可以将其列为一个列表:

[[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]
演示:

您可以使用生成配对:

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

我真的认为您应该在这里使用带基数2的
int()
,这会给出另一个错误值error:需要大于1的值unpack@Anand:那么您可能在其他地方有错误;我只是指出您的生成器的来源。感谢您的指出(expr中的target_列表的expr)我用其他技术解决了这个问题。但我也喜欢[x_o_r(zip(列表(a),列表(b)))表示x中的a表示x中的b]