2016-02-28 69 views
2

我有兩個字典列表,例如,獲取列表中字典的鍵值對位於另一個字典列表中

L1 = [ 
    {'ID': '1', 'file': 'test1', 'ext': 'txt'}, 
    {'ID': '2', 'file': 'test2', 'ext': 'txt'}, 
    {'ID': '3', 'file': 'test3', 'ext': 'py'} 
] 

L2 = [ 
    {'file': 'test1', 'ext': 'txt', 'val': '5'}, 
    {'file': 'test3', 'ext': 'py', 'val': '7'}, 
    {'file': 'test4', 'ext': 'py', 'val': '8'} 
] 

我想從L1提取所有字典,其中的關鍵在於:的'file''ext'值對可以在L2字典中找到。

在我們的例子

L = [ 
    {'ID': '1', 'ext': 'txt', 'file': 'test1'}, 
    {'ID': '3', 'ext': 'py', 'file': 'test3'} 
] 

有一個聰明的Python的方式做到這一點?

+0

那你試試這麼遠嗎? –

回答

1

使用您的輸入:

L1 = [ 
    {'ID': '1', 'file': 'test1', 'ext': 'txt'}, 
    {'ID': '2', 'file': 'test2', 'ext': 'txt'}, 
    {'ID': '3', 'file': 'test3', 'ext': 'py'} 
] 

L2 = [ 
    {'file': 'test1', 'ext': 'txt', 'val': '5'}, 
    {'file': 'test3', 'ext': 'py', 'val': '7'}, 
    {'file': 'test4', 'ext': 'py', 'val': '8'} 
] 

您可以提取file - 一組第一ext雙:

pairs = {(d['file'], d['ext']) for d in L2 for k in d} 

和過濾器他們在第二個步驟:

[d for d in L1 if (d['file'], d['ext']) in pairs] 

結果:

[{'ID': '1', 'ext': 'txt', 'file': 'test1'}, 
{'ID': '3', 'ext': 'py', 'file': 'test3'}] 
4

您可以使用下面的列表理解:

L1 = [ 
    {'ID':'1','file':'test1','ext':'txt'}, 
    {'ID':'2','file':'test2','ext':'txt'}, 
    {'ID':'3','file':'test3','ext':'py'} 
] 

L2 = [ 
    {'file':'test1','ext':'txt','val':'5'}, 
    {'file':'test3','ext':'py','val':'7'}, 
    {'file':'test4','ext':'py','val':'8'} 
] 


L = [d1 for d1 in L1 if any(
     d2.get('file') == d1['file'] and d2.get('ext') == d1['ext'] for d2 in L2)] 
print(L) 

輸出

[{'ID': '1', 'ext': 'txt', 'file': 'test1'}, 
{'ID': '3', 'ext': 'py', 'file': 'test3'}] 

這遍歷每個字典d1L1,併爲每一個測試,如果這兩個鍵:值對和d1['ext']存在於L2的任何字典中。

2

這是一個通用函數(健壯),它將接受匹配關鍵參數。

def extract_matching_dictionaries(l1, l2, mk): 
    return [d1 for d1 in l1 if all(k in d1 for k in mk) and 
      any(all(d1[k] == d2[k] for k in mk) for d2 in l2 if all(k in d2 for k in mk))] 

例子:

>>> extract_matching_dictionaries(L1, L2, ['file', 'ext']) 
[{'ID': '1', 'ext': 'txt', 'file': 'test1'}, 
{'ID': '3', 'ext': 'py', 'file': 'test3'}] 
1
#!/usr/bin/python 
# -*- coding: utf-8 -*- 

L1 = [{'ID': '1', 'file': 'test1', 'ext': 'txt'}, {'ID': '2', 
     'file': 'test2', 'ext': 'txt'}, {'ID': '3', 'file': 'test3', 
     'ext': 'py'}] 

L2 = [{'file': 'test1', 'ext': 'txt', 'val': '5'}, {'file': 'test3', 
     'ext': 'py', 'val': '7'}, {'file': 'test4', 'ext': 'py', 
     'val': '8'}] 

keys = ['file', 'ext'] 

for each in L1: 
    for each1 in L2: 
     if each1[keys[0]] == each[keys[0]] and each1[keys[1]] \ 
== each[keys[1]]: 
      print each 
+0

如果你只是通過索引明確使用它們,'keys'列表的要點是什麼? –

相關問題