字典中多个列表的子元素的交集 - python

我在词典中存储了许多列表。我想找到子列表的交集(即intersection of dict[i][j]) for all keys of the dictionary。)

例如,如果字典中存储的是元组,则可以使用以下代码:

set.intersection(*[index[key] for key in all_keys]) 

什么是有效的方法?我尝试过的一种方法是先将每个列表列表转换为一组元组,然后再取它们的交集,但这相当笨拙。

例:

假设列表列表的字典是

dict = {} 
dict['A'] = [[1, 'charlie'], [2, 'frankie']] 
dict['B'] = [[1, 'charlie'], [2, 'chuck']]
dict['C'] = [[2, 'chuck'], [1, 'charlie']]

那我想回去

[1, 'charlie']

(也许作为一个元组,不必列出)

编辑:我只是找到一种可以的方法,但是它不是很“ pythonic”

def search(index, search_words): 
    rv = {tuple(t) for t in index[search_words[0]]}
    for word in search_words: 
        rv = rv.intersection({tuple(t) for t in index[word]})
    return rv 

python大神给出的解决方案

让我们将列表列表的字典称为d:

>>> d = {'A': [[1, 'charlie'], [2, 'frankie']], 'B': [[1, 'charlie'], [2, 'chuck']], 'C': [[2, 'chuck'], [1, 'charlie']]}

我称它为d是因为dict是内置的,我们不希望覆盖它。

现在,找到交点:

>>> set.intersection( *[ set(tuple(x) for x in d[k]) for k in d ] )
set([(1, 'charlie')])

怎么运行的

set(tuple(x) for x in d[k])

对于键k,这将形成d[k]中元素的元组的集合。以k='A'为例:

>>> k='A'; set(tuple(x) for x in d[k])
set([(2, 'frankie'), (1, 'charlie')])

[ set(tuple(x) for x in d[k]) for k in d ]

这将列出上述步骤中的集合。从而:

>>> [ set(tuple(x) for x in d[k]) for k in d ]
[set([(2, 'frankie'), (1, 'charlie')]),
 set([(2, 'chuck'), (1, 'charlie')]),
 set([(2, 'chuck'), (1, 'charlie')])]

set.intersection( *[ set(tuple(x) for x in d[k]) for k in d ] )

这将如上所述收集三个集合的交集:

>>>set.intersection( *[ set(tuple(x) for x in d[k]) for k in d ] )
set([(1, 'charlie')])