2016-03-02 57 views
-2

我有一個字符串,類似[(a,b),(c,a)]但是更長,我想遍歷2 ^(number_of_variables)列表,這些列表是通過替換每個變量的{0,1}之一而產生的。
在這種情況下,結果將是插入字符串中的每個變量的值

[(0,0),(0,0)] 
[(0,0),(1,0)] 
[(0,1),(0,0)] 
[(0,1),(1,0)] 
[(1,0),(0,1)] 
[(1,0),(1,1)] 
[(1,1),(0,1)] 
[(1,1),(1,1)] 

(如列表,而不是字符串),雖然我不在乎什麼爲了我讓他們進來。我本來想用eval的,但後來看到了this answer。有沒有更好的方法來做這樣的迭代?

(變量的數目是相當小的,所以列表或元組,而不是一個迭代器也將被罰款。)

回答

1

噢噢噢,這看起來像一個有趣的使用Python 3.6的最新formatted string literals的:

for a,b,c in itertools.product((0,1), repeat=3): 
    print(f"[({a},{b}),({c},{a})]") 

太糟糕了,我們無法測試它尚未...

如果你想列出的不是字符串,就可以使用上面通過你的價值觀的笛卡爾積迭代的itertools module爲:

>>> [[(a,b),(c,a)] for a, b, c in itertools.product((0,1), repeat=3)] 
[[(0, 0), (0, 0)], 
[(0, 0), (1, 0)], 
[(0, 1), (0, 0)], 
[(0, 1), (1, 0)], 
[(1, 0), (0, 1)], 
[(1, 0), (1, 1)], 
[(1, 1), (0, 1)], 
[(1, 1), (1, 1)]] 
+0

我還沒有想到,儘管之前使用過列表理解和itertools.product。 (如果我想要字符串,那麼我可以用'str([(a,b),(c,a)]替換'[(a,b),(c,a)]' )'。) –

+0

@TimPietzcker:您錯過了「[({a},{b}),({c},{a})]」'前面的'f' 3.6例子。 – Matthias

+0

@Matthias:糟糕:) –

相關問題