我在词典中存储了许多列表。我想找到子列表的交集(即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')])