2017-10-16 47 views
2

嘗試驗證每個數組項是在詞典的Python:驗證每個數組項是在詞典中

的陣列的陣列
verify_obj = {5492: [2, 3]} 
sc = [{'key': 2, 'key_2': 4}, {'key': 4, 'key_2': 5}, {'key': 5, 'key_2': 7}, {'key': 6, 'key_2': 10}] 
for k, v in verify_obj.items(): 
    if all(i for i in v) != any(j['key1'] for j in sc): 
     print('test fail') 

期待在控制檯test fail印刷該陣列[2, 3]3不在sc對象,但消息未打印。
怎麼回事?

回答

2

所需要的唯一的變化是你的評價:if all(i for i in v) != any(j['key'] for j in sc)

verify_obj = {5492: [2, 3]} 
sc = [{'key': 2}, {'key': 4}, {'key': 5}, {'key': 10}] 
for k, v in verify_obj.items(): 
    if not all([True if x in [values for dict_i in sc for values in dict_i.values()] else False for x in v]): 
     print('test fail') 

any()all()檢查if el,即是當前元素True?你正在檢查的是:True != True這是False

例如,這將打印「考試不及格」爲您例如:

if all(i for i in v) == any(j['key'] for j in sc)

但這只是因爲你因爲沒有整數any()all()沒有False值是False評估時,反對bool

相反,檢查是否在verify_obj任何一個值,在sc任何字典存在。

全部/任何功能REF:https://docs.python.org/3/library/functions.html#any

+0

變化'verify_obj'到'{5492:[2,4]}'和結果也將是'測試failed',但期望不失敗,由於'2'和'4'是在'SC '對象 –

+0

正確,嘗試打印'v'和列表理解,看看會發生什麼。應該有足夠的線索來解釋發生了什麼。 – 00sdf0

+0

通過你的答案'測試fail'將始終打印由於'key'不是一個數組,而是一個整數值,我試圖檢查每一個數組值,即'2','3'在'SC '陣列,只是'key'在'sc'具有價值'2'和'sc'具有價值''3' key','sc'可以有很多'key'值 –

2

使用any()與狀態檢查,如果在verify_obj的列表中的任何值不在scsub包含在verify_obj中的列表。 supsc中值的列表。

verify_obj = {5492: [2, 3]} 
sc = [{'key': 2}, {'key': 4}, {'key': 5}, {'key': 10}] 

sub = next(iter(verify_obj.values())) 
sup = [v for d in sc for k, v in d.items() if k == "key"] 

if any(v not in sup for v in sub): 
    print("test fail") 

issubset()也可以做到這一點。要使用它,必須將verify_obj中的列表轉換爲一組。用於該函數的參數是sc中的一組值。

verify_obj = {5492: [2, 3]} 
sc = [{'key': 2}, {'key': 4}, {'key': 5}, {'key': 10}] 

s = set(next(iter(verify_obj.values()))) 

if not s.issubset(v for d in sc for k, v in d.items() if k == "key"): 
    print("test fail") 
+0

需要通過名稱'key'驗證字典值,而不是所有的值,字典可能包含很多密鑰 –

+0

@ВладДавидченко我已經更新我的答案來檢查密鑰名稱。 – Mark

+0

thx,使用的解決方案的列表類似於'如果有的話(k不在[j ['key'] for j in sc] for k in v):print('test failed')' –