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

2024-03-28 16:30:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本字典,像:

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)]}

我想比较一下这个字典的值,然后在所有元组列表中创建另一个包含类似index[0]的dict,比如:

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的所有值中!你知道吗


Tags: 答案列表index字典情况booksdict元组
2条回答

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

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)]}

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

firsts = [set([pair[0] for pair in v]) for v in dict.values()]

要查找出现在所有条目中的值,可以执行集合交集:

similar = reduce(lambda x,y: x.intersection(y), firsts)

然后可以过滤dict,使其仅具有属于交叉点的对:

filtered = { k:[pair for pair in v if pair[0] in similar] \
             for k,v in dict.items() }

相关问题 更多 >