2016-10-28 131 views
0

我正在處理一些謎團,並希望有一些清晰。我寫了一個腳本查找骰子的組合增加了24看起來像以下:創建意想不到的元組值

start=[3,3,3,3,3,3,3,3] 
outcomes=set(tuple(start)) #Use a set to ensure uniqueness 

index_list=np.random.randint(0,8,1000) 

#This little snippet adds one and subtracts one randomly, keeping total at 24 
for i in xrange(0,500): 
    upper=index_list[i] 
    downer=index_list[i+20] 

    if start[upper]!=6 and start[downer]!=1: 
     start[upper]=start[upper]+1 
     start[downer]=start[downer]-1 
     outcomes.add(tuple(start)) 

print outcomes 

我遇到什麼,就是當我看到的結果,有型「詮釋」單3那裏。

set([(4, 4, 4, 3, 2, 2, 2, 3), 3, (2, 5, 4, 3, 1, 4, 2, 3), (4, 4, 4, 2, 3, 1, 3, 3),(4, 2, 5, 2, 3, 4, 1, 3)]) 

雖然我當然可以刪除它,但我只是好奇它是如何進入那裏的?我最初的猜測是索引列表可能會產生[0-7]之外的索引,但事實並非如此。我在其他地方找過類似的問題,但還沒有找到類似的問題。謝謝!

回答

1

set期望可迭代。你傳遞了一個可迭代的tupleset遍歷它,只剩下1個值:3(因爲你的元組只包含相同的3值)。

你必須把你的元素列表或元組左右(當你傳遞一個字符串完全相同的問題,它是突如其來迭代),它被視爲一個單一的元素

你的代碼的其餘部分是好,並且與問題無關。通過1元組的列表

outcomes=set([tuple(start),]) 

現在set迭代,從而有效地創建tuple元素:

改爲這樣做。

你可以做到這一點還,也許更簡單:

outcomes=set() 
outcomes.add(tuple(start)) 

沒有歧義,因爲你加1元。它沒有迭代。

+0

啊,這是有道理的!誰低估了你爲什麼這樣做?這是不是一種pythonic這樣做,或者是否有其他理由downvote它呢? –

+0

我正要對downvote發表評論。有人誤解了這個問題......我也不明白。 –

+1

@MasonGardner我沒有低調,但我沒有贊成的原因是,我認爲這個解釋有點誤導/不明顯。 'set'確實期望可迭代,但[tuples *是* iterables](https://docs.python.org/2/glossary.html#term-iterable) - 這個答案使它聽起來像是沒有。你得到'3'的原因是因爲這是'(3,3,3,3,3,3,3,3)'唯一的唯一值。 – elethan

相關問題