如何使用python比较字典的值并为答案创建新字典

如何使用python比较字典的值并为答案创建新字典,python,list,dictionary,tuples,Python,List,Dictionary,Tuples,我有一本字典,像: dict = {'Books' : [(2,2), (3,4), (7,19)], 'CDs' : [(1,9), (3,5), (3,6), (10,9)], 'Toys' : [(0,1), (2,8), (3,3), (4,6)]} 我想比较这本字典的值,并制作另一个dict,在所有元组列表中包含类似的索引[0],如: dict = {'Books' : [(3,4)], 'CDs' : [(3,5), (3,

我有一本字典,像:

dict = {'Books' : [(2,2), (3,4), (7,19)],
        'CDs'   : [(1,9), (3,5), (3,6), (10,9)],
        'Toys'  : [(0,1), (2,8), (3,3), (4,6)]}
我想比较这本字典的值,并制作另一个dict,在所有元组列表中包含类似的
索引[0]
,如:

dict = {'Books' : [(3,4)],
        'CDs'   : [(3,5), (3,6)],
        'Toys'  : [(3,3)]}
在dict的所有值中,索引为[0]的类似元组不能超过一个
我找到了这个问题的多个答案,但没有任何积极的结果。
下面的格言不是我的情况:

dict = {'Books' : [(2,2), (3,4), (7,19)],
        'CDs'   : [(1,9), (2,7)(3,5), (3,6), (10,9)],
        'Toys'  : [(0,1), (2,8), (3,3), (4,6)]}
像索引[0]中的“2”一样出现在dict的所有值中

如果“相似”是指元组的第一个索引相同,则类似于:

d =  {'Books' : [(2,2), (3,4), (7,19)],
        'CDs'   : [(1,9), (3,5), (3,6), (10,9)],
        'Toys'  : [(0,1), (2,8), (3,3), (4,6)]}

def find_when(d, n):
    return {k: [el for el in v if el[0] == n] for k, v in d.iteritems()}

print find_when(d, 3)
# {'CDs': [(3, 5), (3, 6)], 'Books': [(3, 4)], 'Toys': [(3, 3)]}

首先,您需要一个包含所有第一个元素的集合(按键分组):

要查找在所有条目中显示的值,可以执行以下操作:

similar = reduce(lambda x,y: x.intersection(y), firsts)
filtered = { k:[pair for pair in v if pair[0] in similar] \
             for k,v in dict.items() }
然后,您可以过滤dict,使其仅具有属于交叉点的对:

similar = reduce(lambda x,y: x.intersection(y), firsts)
filtered = { k:[pair for pair in v if pair[0] in similar] \
             for k,v in dict.items() }

请精确定义“相似性”。切比雪夫距离的结果是否算作相似?(3,4)与(2,3)和(4,3)相似吗?你说的“相似”可能是指“普通”吧?如:“制作另一个dict,其中包含所有列表共用的
索引[0]
的值”。我解释得对吗?(在第一个示例中,
2
并不常见-因为它在
'CDs'
中不存在-但在第二个示例中,它变得很常见)@mgibsonbr:正是:)