Python 2.7: поиск общих элементов на основе одного значения ключа из 2 списка словарей - PullRequest
0 голосов
/ 21 мая 2019

Мой список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}
]

мой список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},
]

Я хотел бы иметь окончательный список, который содержит имя_сигнала , которые находятся в list1 и list2. Здесь bsw_ и bsw_v находятся в обоих списках. Итак, окончательный список:

[
{'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},
]

Как это можно сделать с минимальным использованием кода на python?

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Это один подход путем создания set в качестве поиска.

Пример:

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)

Вывод:

[{'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'}]
1 голос
/ 21 мая 2019

Вы можете использовать список cmppresion:

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

Выход :

[{'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}]
...