2015-08-06 3 views
2

ниже - мой код, любой может помочь мне оптимизировать процесс, используя функцию библиотеки встроенных функций python 3?Python 3 - пересечение нескольких словарных ключей

Dict1 = {'ky1':1, 'ky2':2,'ky_3':3} 
Dict2 = {'ky1':4, 'ky2':5,'ky_4':6} 
Dict3 = {'ky2':7, 'ky3':8,'ky_5':9} 
D = [Dict1,Dict2,Dict3] 
Keys_list = [] 
for i in D: 
    tmp = list(i.keys()) 
    Keys_list.append(tmp) 
Output = list(set.intersection(*map(set,Keys_list))) 

Мои Dict1, Dict2, Dict3 является большой словарь
благодаря

+0

В приведенном выше примере, что вы хотите в качестве вывода? –

ответ

0

Если вы просто хотите, чтобы список всех ключей во всех словарях, вы можете использовать dict.viewkeys() (для Python 2.7) или dict.keys() в Python 3.x, чтобы получить объект просмотра словаря, а затем пересечь их.

Пример для Python 3.x -

>>> Dict1 = {'ky1':1, 'ky2':2,'ky_3':3} 
>>> Dict2 = {'ky1':4, 'ky2':5,'ky_4':6} 
>>> Dict3 = {'ky2':7, 'ky3':8,'ky_5':9} 
>>> 
>>> Dict1.keys() & Dict2.keys() & Dict3.keys() 
{'ky2'} 
>>> list(Dict1.keys() & Dict2.keys() & Dict3.keys()) 
['ky2'] 

Для Python 2.7 Dict1.viewkeys() использования, и т.д., вместо того, чтобы .keys().


Если у вас есть список словарей, один из способов сделать это в одной строке с помощью functools.reduce() функции, будет -

>>> ld = [{'ky1':1, 'ky2':2,'ky_3':3},{'ky1':4, 'ky2':5,'ky_4':6},{'ky2':7, 'ky3':8,'ky_5':9}] 
>>> res = list(reduce(lambda x, y: x & y.keys() , ld)) 
>>> res 
['ky2'] 

Сходная логика, используя цикл -

>>> ld = [{'ky1':1, 'ky2':2,'ky_3':3},{'ky1':4, 'ky2':5,'ky_4':6},{'ky2':7, 'ky3':8,'ky_5':9}] 
>>> res = None 
>>> for d in ld: 
...  if not res: 
...    res = d.keys() 
...  else: 
...    res = res & d.keys() 
... 
>>> list(res) 
['ky2'] 
+0

Дорогой Ананд С Кумар, спасибо за предложение, но у меня есть несколько словарей (указанный размер N), и каждый словарь с (многие ключи, сказал-10k), так как решить проблему? спасибо, –

+0

Как хранятся словари? –

0

Если я правильно понял ваш вопрос, вы ищете перекрестные ключи среди всех трех словарей, верно?

Если это так, вам нужно только перебрать один из них, и процесс прост.

isect = [i for i in Dict1 if all(i in d for d in (Dict1,Dict2,Dict3))] 

print(isect) 

В списке понимание перебирает одного Dict, и каждый элемент ищется во всех трех dicts. Если он присутствует, он будет добавлен в список. Вы получите:

['ky2'] 

как выход.

+0

Уважаемый Renae Lider, заблаговременно заблаговременно за предложение, но у меня есть несколько словарей (указанный размер N), и каждый словарь с (многие ключи, сказал-10k), так как решить проблему? спасибо, –

+0

@ Поиск словаря ChinLim - это операция *** O (1) *** (средняя). Вам не нужно беспокоиться о размере. *** O (n) *** - худший случай. –

Смежные вопросы