2013-07-23 63 views
0

我有一個列表,Python的 - 結果返回發電機列表,而不是(理解)

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

這裏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>,.....] 

我不明白,我身邊有結果的[]

我甚至試過convet個別發電機列表(也試過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

我真的認爲你應該在這裏使用'int()'與基地2 ... –

回答

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函數採取2個輸入,以及可能使用的整數使用更優化的方法:

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

,給出了另一個錯誤ValueError:需要超過1個值來解壓 – Anand

+0

@Anand:那麼你可能有一個錯誤*其他地方*;我只是指出你的發電機來自哪裏。 –

+0

謝謝指出(expr爲expr中的target_list)塊。我解決了使用其他技術。但我也喜歡這[x_o_r(zip(list(a),list(b)))for a x in x for b in x] – Anand

相關問題