2013-08-23 80 views
0

我想檢查一個列表是否已經在Python中的字典中。 我的代碼應該生成2個隨機數(r1和r2),並將它們追加到字典中的列表中,如果那些相同的2個數字不在那裏。下面是代碼:檢查列表是否已經在python中的字典中

main_dict = {0:[], 1:[], 2:[], 3:[], 4:[]} 
for x in range(0,5): 
    r1 = randint(1,5) 
    r2 = randint(1,5) 
    temp = [r1,r2] 
    if temp not in main_dict: 
     main_dict[x].append(r1) 
     main_dict[x].append(r2) 

所以基本上main_dict應該看起來像這樣:{0:[2,3],1:[4,1],2:[3,3],3:[3 ,2],4:[5,1]},上面的代碼應該注意不要重複組合。

錯誤是「TypeError:unhashable type:'list'」,我想這是因爲我不能在旁邊放一個列表if,但我不知道還有什麼要放,我已經試過了那是我想到的。

感謝提前:)

+2

什麼符合匹配條件?會3:[3,2]比賽[2,3]? 如果不是,那麼'if temp不在main_dict.values():'中? –

回答

2

變化if temp not in main_dict:if temp not in main_dict.values():

4

你所得到的問題,是因爲你正在尋找在一本字典,如果列表中存在。這樣,你就可以將你的列表與字典的鍵進行比較。你想要做的是:

if temp not in manin_dict.values(): 
+0

我不確定,但是當你談論元組時,你可能會在你的解釋中混合使用'main_dict'中的'x和main_dict.items()'中的'x'。 – Hyperboreus

+0

你是絕對正確的,它與main_dict的鍵相比。那麼謝謝! – Jblasco

+0

非常感謝,作品像一個魅力:) – hpdobrica

1

名單不能被散列,因爲它是可以改變的。你想要什麼可以有效地使用元組而不是列表和一組來避免重複。如果您打算更改列表,可能需要解決一些問題。

main_dict = dict((i,[]) for i range(0,5)) 
main_set = set() 
for x in range(0,5): 
    r1 = randint(1,5) 
    r2 = randint(1,5) 
    temp = (r1,r2) # This is the same as tuple([r1,r2]) 
    if temp not in main_set: 
     main_dict[x] = temp 
     main_set.add(temp) 

請注意,您可以避免字典,只需添加到集,如果你只是想要的元組集。使用一個集合的原因是檢查一個元素是否在集合中是O(1),同時檢查一個元素是否在字典值列表中是O(N)。不是你會注意到只有5個值,但如果你有更多的值,肯定是這樣。

+0

現在我明白你的意思了...... +1! – Jblasco

相關問題