Anudocs
Anudocs

Reputation: 686

Python 2.7 : Finding common elements based on one key value from 2 list of dictionaries

My list1 of signals is

[
{'min_wert': 0L, 'aufloesung': u'0.01', 'signal_name': u'bsw_', 'max_wert': 33L},
{'min_wert': None, 'aufloesung': None, 'signal_name': u'bsw_v', 'max_wert': None},
{'min_wert': None, 'aufloesung': None, 'signal_name': u'fga_', 'max_wert': None},
{'min_wert': 0L, 'aufloesung': 1L, 'signal_name': u'can_', 'max_wert': 1L},
{'min_wert': None, 'aufloesung': None, 'signal_name': u'eps_', 'max_wert': None}
]

my list2 of signals is :

[
{'min_wert': 0L, 'aufloesung': u'0.01', 'signal_name': u'bsw_', 'max_wert': 33L},
{'min_wert': None, 'aufloesung': None, 'signal_name': u'bsw_v', 'max_wert': None},
{'min_wert': None, 'aufloesung': None, 'signal_name': None, 'max_wert': None},
]

I would like to have final list which contain signal_name which are in list1 and list2. Here bsw_ and bsw_v are in both lists. So final list is :

[
{'min_wert': 0L, 'aufloesung': u'0.01', 'signal_name': u'bsw_', 'max_wert': 33L},
{'min_wert': None, 'aufloesung': None, 'signal_name': u'bsw_v', 'max_wert': None},
]

How It can be done with minimum use of code in python?

Upvotes: 0

Views: 34

Answers (2)

Rakesh
Rakesh

Reputation: 82765

This is one approach by creating a set as a lookup.

Ex:

data_1 = [
{'min_wert': 0L, 'aufloesung': u'0.01', 'signal_name': u'bsw_', 'max_wert': 33L},
{'min_wert': None, 'aufloesung': None, 'signal_name': u'bsw_v', 'max_wert': None},
{'min_wert': None, 'aufloesung': None, 'signal_name': u'fga_', 'max_wert': None},
{'min_wert': 0L, 'aufloesung': 1L, 'signal_name': u'can_', 'max_wert': 1L},
{'min_wert': None, 'aufloesung': None, 'signal_name': u'eps_', 'max_wert': None}
]

data_2 = [
{'min_wert': 0L, 'aufloesung': u'0.01', 'signal_name': u'bsw_', 'max_wert': 33L},
{'min_wert': None, 'aufloesung': None, 'signal_name': u'bsw_v', 'max_wert': None},
{'min_wert': None, 'aufloesung': None, 'signal_name': None, 'max_wert': None},
]

check_val = {i['signal_name'] for i in data_2}                #Loopup.
result = [i for i in data_1 if i['signal_name'] in check_val]
print(result)

Output:

[{'aufloesung': u'0.01',
  'max_wert': 33L,
  'min_wert': 0L,
  'signal_name': u'bsw_'},
 {'aufloesung': None,
  'max_wert': None,
  'min_wert': None,
  'signal_name': u'bsw_v'}]

Upvotes: 1

Arkistarvh Kltzuonstev
Arkistarvh Kltzuonstev

Reputation: 6920

You can use list cmprehension :

l1 = [...] # First list
l2 = [...] # Second list
[k for k in l1 for m in l2 if k['signal_name']==m['signal_name']]

Output :

[{'min_wert': 0L, 'aufloesung': u'0.01', 'signal_name': u'bsw_', 'max_wert': 33L}, 
{'min_wert': None, 'aufloesung': None, 'signal_name': u'bsw_v', 'max_wert': None}]

Upvotes: 2

Related Questions