簡體   English   中英

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

[英]Python - Result returns generator instead of list (comprehension)

我有一個清單

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]

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

[
    (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()實用程序函數來生成配對:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM