Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 字典中多个列表的子元素的交集_Python_List_Set - Fatal编程技术网

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

Python 字典中多个列表的子元素的交集,python,list,set,Python,List,Set,我在字典里有很多列表。我想找到字典所有键的子列表的交集(即dict[I][j]的交集) 例如,如果字典存储元组集,我可以使用以下代码: set.intersection(*[index[key] for key in all_keys]) 做这件事的有效方法是什么?我尝试的一种方法是首先将每个列表转换为一组元组,然后取它们的交集,但这相当笨拙 例如: 假设列表字典是 dict = {} dict['A'] = [[1, 'charlie'], [2, 'frankie']] dict['

我在字典里有很多列表。我想找到字典所有键的子列表的交集(即dict[I][j]的交集)

例如,如果字典存储元组集,我可以使用以下代码:

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 

您的用例需要使用
reduce
函数。但是引用,

所以现在
reduce()
。这实际上是我最讨厌的一个,因为除了一些涉及
+
*
的例子外,几乎每次我看到一个带有非平凡函数参数的
reduce()
调用,我都需要抓起笔和纸来绘制实际输入到该函数中的内容,然后才能理解reduce()是什么应该这样做。因此,在我看来,
reduce()
的适用性仅限于关联运算符,在所有其他情况下,最好显式写出累加循环。

所以,你已经得到了“pythonic”

我会这样写程序

>>> d = {'A': [[1, 'charlie'], [2, 'frankie']],
... 'B': [[1, 'charlie'], [2, 'chuck']],
... 'C': [[2, 'chuck'], [1, 'charlie']]}
>>> values = (value for value in d.values())
>>> result = {tuple(item) for item in next(values)}
>>> for item in values:
...    result &= frozenset(tuple(items) for items in item)
>>> result
set([(1, 'charlie')])

让我们调用您的列表字典
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(d[k]中x的元组(x))

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

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

    这将生成上述步骤中的集合列表。因此:

    >>> [ 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)表示d中的x[k])表示d中的k])

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

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

你能给我一个样品吗?是的!刚刚加了一个——谢谢。这里面有字典吗?题目说词典a、B和C存储在词典中。我将进行编辑,以明确列表的数量会有所不同,它们存储在字典中。每个列表只能包含一次项目,还是单个列表中会有冗余?这是一个好问题。我很确定每个列表中只有一个项目。。。但这只是些粗略的数据,所以我不确定我是否会相信这个假设。因为如果是这样的话,你可以添加所有三个列表和美国收藏。数一数看哪一个有三个。太棒了,正是我需要的。我试着做了一段时间类似的事情,但我的记谱法一定是错了。谢谢
>>>set.intersection( *[ set(tuple(x) for x in d[k]) for k in d ] )
set([(1, 'charlie')])
from collections import defaultdict    
d = {'A': [[1, 'charlie'], [2, 'frankie']], 'B': [[1, 'charlie'], [2, 'chuck']], 'C': [[2, 'chuck'], [1, 'charlie']]}

frequency = defaultdict(set)
for key, items in d.iteritems():
    for pair in items:
        frequency[tuple(pair)].add(key)
output = [
    pair for pair, occurrances in frequency.iteritems() if len(d) == len(occurrances)
]
print output