2016-08-31 5 views
3

Это вопрос о Python. У меня есть следующий список словарей:Создайте новый список из двух словарей

listA = [ 
      {"t": 1, "tid": 2, "gtm": 3, "c1": 4, "id": "111"}, 
      {"t": 3, "tid": 4, "gtm": 3, "c1": 4, "c2": 5, "id": "222"}, 
      {"t": 1, "tid": 2, "gtm": 3, "c1": 4, "c2": 5, "id": "333"}, 
      {"t": 5, "tid": 6, "gtm": 3, "c1": 4, "c2": 5, "id": "444"} 
     ] 

и словарь Я хотел сравнить с:

dictA = {"t": 1, "tid": 2, "gtm": 3} 

Я хотел создать список dicts, которые соответствуют всем элементам в изречениях из lišta и включить в поле «ID», а также:

listB = [ 
      {"t": 1, "tid": 2, "gtm": 3, "id": "111"}, 
      {"t": 1, "tid": 2, "gtm": 3, "id": "333"} 
     ] 

Я попытался сделать это:

for k in listA: 
    for key, value in k.viewitems() & dictA.viewitems(): 
     print key, value 

Но это соответствие любого элемента в изречениях.

+0

@ Сэм, от вопроса тегов, и читать весь вопрос, я думаю, это Python –

ответ

3

Вы должны были бы проверить длину пересечения, просто проверка if dct.viewitems() & dictA.viewitems() будет вычисляться значение True для любого пересечения:

[dct for dct in listA if len(dct.viewitems() & dictA.viewitems()) == len(dictA)] 

Или просто проверить для подмножества, если элементы из изречения являются в subset каждого Dict:

[dct for dct in listA if dictA.viewitems() <= dct.viewitems()] 

Или обратной логики ищет superset:

[dct for dct in listA if dct.viewitems() >= dictA.viewitems()] 
+2

как я люблю python один лайнер – px06

+0

Мне нравится ваше второе предложение с использованием подмножеств! ! –

+1

Не беспокойтесь, он также будет намного более эффективным, так как он будет замыкаться на короткое замыкание и не будет создавать набор пересекающихся объектов. –

2

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

listA = [ 
      {"t": 1, "tid": 2, "gtm": 3, "c1": 4, "id": "111"}, 
      {"t": 3, "tid": 4, "gtm": 3, "c1": 4, "c2": 5, "id": "222"}, 
      {"t": 1, "tid": 2, "gtm": 3, "c1": 4, "c2": 5, "id": "333"}, 
      {"t": 5, "tid": 6, "gtm": 3, "c1": 4, "c2": 5, "id": "444"} 
     ] 

dictA = {"t": 1, "tid": 2, "gtm": 3} 

for k in listA: 
    if dictA.viewitems() <= k.viewitems(): 
     print k 

И для Python 3 использования:

if dictA.items() <= k.items(): 
    print(k) 
+1

Было бы удивительным, если вы оставить комментарий, если голосование вниз. Тем более, что это создает правильные результаты. – Phidelux

+0

Удивительный! Строка "if dictA.viewitems() <= k.viewitems() "переводит на" если dictA является подмножеством k "- я прав? –

+1

Почти, он переводится как« если dictA является подмножеством или равно k ». – Phidelux

1

Для питона 2.7:

listA = [ 
       {"t": 1, "tid": 2, "gtm": 3, "c1": 4, "id": "111"}, 
       {"t": 3, "tid": 4, "gtm": 3, "c1": 4, "c2": 5, "id": "222"}, 
       {"t": 1, "tid": 2, "gtm": 3, "c1": 4, "c2": 5, "id": "333"}, 
       {"t": 5, "tid": 6, "gtm": 3, "c1": 4, "c2": 5, "id": "444"} 
      ] 
dictA = {"t": 1, "tid": 2, "gtm": 3} 
for k in listA: 
    if all(x in k.viewitems() for x in dictA.viewitems()): 
     print k 

Это дает выход как:

{'tid': 2, 'c1': 4, 'id': '111', 't': 1, 'gtm': 3} 
{'gtm': 3, 't': 1, 'tid': 2, 'c2': 5, 'c1': 4, 'id': '333'} 

И если вы хотите, чтобы создать список, то вместо print, добавить словарь в список Как следует:

listA = [ 
      {"t": 1, "tid": 2, "gtm": 3, "c1": 4, "id": "111"}, 
      {"t": 3, "tid": 4, "gtm": 3, "c1": 4, "c2": 5, "id": "222"}, 
      {"t": 1, "tid": 2, "gtm": 3, "c1": 4, "c2": 5, "id": "333"}, 
      {"t": 5, "tid": 6, "gtm": 3, "c1": 4, "c2": 5, "id": "444"} 
     ] 
dictA = {"t": 1, "tid": 2, "gtm": 3} 
ans =[] 
for k in listA: 
    if all(x in k.viewitems() for x in dictA.viewitems()): 
     ans.append(k) 
     #print k 
print ans 

Это дает выход:

[{'tid': 2, 'c1': 4, 'id': '111', 't': 1, 'gtm': 3}, {'gtm': 3, 't': 1, 'tid': 2, 'c2': 5, 'c1': 4, 'id': '333'}] 
1

Попробуйте это, all проверит существование dictA в listA.

[i for i in listA if all(j in i.items() for j in dictA.items())] 

Результат

[{'c1': 4, 'gtm': 3, 'id': '111', 't': 1, 'tid': 2}, 
{'c1': 4, 'c2': 5, 'gtm': 3, 'id': '333', 't': 1, 'tid': 2}] 
Смежные вопросы