2017-02-20 7 views
0

Я нашел похожие, почти одинаковые вопросы, но ни один из них не помог мне. Например, если у меня есть два списка:Как найти пересечение двух списков словарей в Python 3?

list1 = [{'a':1,'b':2,'c':3},{'a':1, 'b':5, 'c':6}] 
list2 = [{'a':2,'b':4,'c':9},{'a':1, 'b':4, 'c':139}] 

Вы можете видеть, что в первом списке всех dicts имеют такое же «а» и во втором ключе «Ь» является одинаковым во всех dicts в списке. Я хочу найти словарь, который имеет ключ «a» из первого списка и ключ «b» из второго списка, но только если этот словарь находится внутри одного из этих списков (в этом примере это будет [{'a': 1 , 'b': 4, 'c': 139}]). Большое спасибо заранее

+0

что условие с: 139, чтобы прийти в выходные? Я вижу, что это не повторяется ни в одном из списков. –

+0

Это просто случайное число –

+1

, поэтому '[{'a': 1, 'b': 4, 'c': 149}]' будет действительным результатом для вашего вопроса? –

ответ

0

Не особенно привлекательно, но делает трюк.

list1 = [{'a':1,'b':2,'c':3},{'a':1, 'b':5, 'c':6}] 
list2 = [{'a':2,'b':4,'c':9},{'a':1, 'b':4, 'c':139}] 

newdict = {} #the dictionary with appropriate 'a' and 'b' values that you will then search for 

#get 'a' value 
if list1[0]['a']==list1[1]['a']: 
    newdict['a'] = list1[0]['a'] 
#get 'b' value 
if list2[0]['b']==list2[1]['b']: 
    newdict['b'] = list2[0]['b'] 

#just in case 'a' and 'b' are not in list1 and list2, respectively 
if len(newdict)!=2: 
    return 

#find if a dictionary that matches newdict in list1 or list2, if it exists 
for dict in list1+list2: 
    matches = True #assume the dictionaries 'a' and 'b' values match 

    for item in newdict: #run through 'a' and 'b' 
     if item not in dict: 
      matches = False 
     else: 
      if dict[item]!=newdict[item]: 
       matches = False 
    if matches: 
     print(dict) 
     return 
+0

Ты гениальный брат ... Спасибо тебе большое :) –

0

Это решение работает с любыми ключами:

def key_same_in_all_dict(dict_list): 
    same_value = None 
    same_value_key = None 
    for key, value in dict_list[0].items(): 
     if all(d[key] == value for d in dict_list): 
      same_value = value 
      same_value_key = key 
      break 
    return same_value, same_value_key 

list1 = [{'a':1,'b':2,'c':3},{'a':1, 'b':5, 'c':6}] 
list2 = [{'a':2,'b':4,'c':9},{'a':1, 'b':4, 'c':139}] 

list1value, list1key = key_same_in_all_dict(list1) 
list2value, list2key = key_same_in_all_dict(list2) 

for dictionary in list1 + list2: 
    if list1key in dictionary and dictionary[list1key] == list1value and list2key in dictionary and dictionary[list2key] == list2value: 
      print(dictionary) 

Печать {'a': 1, 'b': 4, 'c': 139}

0

Это может быть:

your_a = list1[0]['a'] # will give 1 
your_b = list2[0]['b'] # will give 4 

answer = next((x for x in list1 + list2 if x['a'] == your_a and x['b'] == your_b), None) 
Смежные вопросы