2016-11-24 36 views
0

我想做一個斷言,如果列表字典中有多個變量會引發錯誤。Python:斷言,如果變量是在多個列表

我現在已經寫下如下,但我想知道是否有人可以提出一種方法來縮短它。

assert_counter = 0 
l = ['a','b','c'] 
d = {'list1':['a'], 'list2':['b', 'c'], 'list3':['a']} 

for variable in l: 
    assert_counter = 0 
    for inside in d: 
     if (variable in d[inside]): 
      assert_counter = assert_counter + 1 
      assert assert_counter > 1, (str(variable) + " is in more than one list") 
+0

您提供的代碼未運行。有一個工作代碼首先是非常有用的,或者你想重新提出你的問題是關於你的代碼中的錯誤? – chthonicdaemon

+0

在優化模式下運行代碼時,斷言會被刪除,請勿將它們用於實際編程,只是使用它們來確保代碼是正確的。如果你想得到異常,請使用raise。 – Adirio

+2

也不要使用'list'和'dict'作爲變量。 –

回答

0

的最有效方法是對列表進行排序,如果你不已經排序列表,排序的搜索列表和搜索列表中的每個元素檢查所有其他列表的標題。複雜度爲n*m*c+c*m*log(m),其中n是搜索列表大小,m是最大子列表大小,c是此類列表的數量。

0

使用itertools.chain可將值連接在一起(您不需要鍵)並在值上使用collections.Counter。 過濾器的出現

的數量

我的一行代碼:

import collections,itertools 

l = ['a','b','c'] 
d = {'list1':['a'], 'list2':['b', 'c'], 'list3':['a']} 

c = [k for k,v in collections.Counter(itertools.chain(*d.values())).items() if v>1 and k in l] 

print(c) 

結果:

['a'] 
0

一個相對簡單的方法來檢查複製是通過計數:

import itertools, collections 

t = {'list1':['a'], 'list2':['b', 'c'], 'list3':['a']} 
counts = collections.Counter(itertools.chain.from_iterable(t.values())) 
duplicated_variables = [k for k, v in counts.items() if v > 1] 

然後,您可以執行如下操作:

if duplicated_variables: 
    raise ValueError('Duplicated Variables: {}'.format(duplicated_variables))