比较Python中同一字典中每个键的字典值

问题描述

|| 更新: 再一次问好。我的问题是,如何比较字典的值是否相等。有关我的词典的更多信息: 关键是会话号 每个键的值是嵌套列表-> f.e. [[1,0],[2,0],[3,1]] 每个密钥的值长度相同,因此会话号1的值可能大于会话号2的值 这里是一个示例字典:   order_session =   {1:[[100,0],[22,1],[23,2]],10:[100,0],[232,0],[10,2],[11,2]], 22:[[5,2],[23,2],.......,   ...} 我的目标: 步骤1:将会话编号1的值与字典中所有其他会话编号的值进行比较以确保相等 步骤2:获取一个会话号并将这些值与其他会话号的其他值进行比较,依此类推 -最后,我们比较了每个会话号的值 步骤3:将结果保存到列表中f.e.     输出= [[100,0],[23,2],...]或输出= [(100,0),(23,2),...] 如果您可以看到会话1和会话10的值对[100,0]相同。会话1和22的值对[23,2]相同。 谢谢你的协助。 更新2 感谢您提供的所有帮助和技巧,这些技巧和技巧将列表的嵌套列表更改为元组列表,这对于处理它是非常好的。 我更喜欢Boaz Yaniv解决方案;) 我也喜欢使用collections.Counter()...不幸的是我使用2.6.4(Counter在2.7上工作),也许有时我会更改为2.7。     

解决方法

如果字典很长,则需要使用集合,以获得更好的性能(在列表中查找已经遇到的值将非常慢):
def get_repeated_values(sessions):
    known = set()
    already_repeated = set()
    for lst in sessions.itervalues():
        session_set = set(tuple(x) for x in lst)
        repeated = (known & session_set) - already_repeated
        already_repeated |= repeated
        known |= session_set
        for val in repeated:
            yield val

sessions = {1:[[100,0],[22,1],[23,2]],10:[[100,[232,[10,2],[11,22:[[5,2]]}
for x in get_repeated_values(sessions):
    print x
我还建议(出于性能考虑,再次)将元组嵌套在列表中,而不是列表中(如果您不希望即时更改它们)。我在此处发布的代码将以任何一种方式工作,但是如果值已经是元组,它将更快。     ,可能有一个更好,更优化的方法来执行此操作,但是我会从这里开始:
seen = []
output = []

for val in order_session.values():
    for vp in val:
        if vp in seen:
            if not vp in output:
                output.append(vp)
        else:
            seen.append(vp)

print(output)
基本上,这是通过所有值进行查看的,如果该值在以前看到过但在之前没有看到过,则将其附加到输出中。 请注意,这适用于值对的实际值-如果您具有导致指针的各种对象,则我的算法可能会失败(我尚未对其进行测试,所以不确定)。 Python对\“ low \”整数重复使用相同的对象引用;也就是说,如果您依次运行语句
a = 5
b = 5
,则
a
b
将指向同一整数对象。但是,如果将它们设置为10 ^ 5,则不会。但是我不知道限制在哪里,所以我不确定这是否适用于您的代码。     ,
>>> from collections import Counter
>>> D = {1:[[100,... 10:[[100,... 22:[[5,2]]}
>>> [k for k,v in Counter(tuple(j) for i in D.values() for j in i).items() if v>1]
[(23,2),(100,0)]
如果您真的需要列表清单
>>> [list(k) for k,v in Counter(tuple(j) for i in D.values() for j in i).items() if v>1]
[[23,[100,0]]
    ,
order_session = {1:[[100,[80,21]],}
output = []
for pair in sum(order_session.values(),[]):
    if sum(order_session.values(),[]).count(pair) > 1 and pair not in output:
        output.append(pair)

print output
...
[[100,2]]