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

比较Python中同一字典中每个键的字典值,python,dictionary,Python,Dictionary,更新: 你好。我的问题是,如何比较字典中的值是否相等。有关我的字典的更多信息: 键是会话号 每个键的值都是嵌套列表->f.e [1,0],[2,0],[3,1]] 每个键的值的长度不同,因此会话号1的值可能比会话号2的值多 下面是一个示例词典: 秩序会议= {1:[[100,0],[22,1],[23,2]],10:[100,0],[232,0],[10,2],[11,2]],22:[[5,2],[23,2],....], …} 我的目标是: 步骤1:将会话编号1的值与字典中所有其他会话编号

更新:

你好。我的问题是,如何比较字典中的值是否相等。有关我的字典的更多信息:

  • 键是会话号
  • 每个键的值都是嵌套列表->f.e

    [1,0],[2,0],[3,1]]

  • 每个键的值的长度不同,因此会话号1的值可能比会话号2的值多

  • 下面是一个示例词典:
秩序会议= {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(计数器在2.7下工作),也许有时我会改为2.7。

可能有更好、更优化的方法来实现这一点,但我会从这里开始:

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对“低”整数重新使用相同的对象引用;也就是说,如果您依次运行语句
a=5
b=5
a
b
将指向同一个整数对象。但是,如果您将它们设置为10^5,则它们不会。但是我不知道限制在哪里,所以我不确定这是否适用于您的代码。

如果您的字典很长,您可能希望使用集合,以获得更好的性能(在列表中查找已经遇到的值将非常慢):

我还建议(出于性能原因)在列表中嵌套元组,而不是在列表中嵌套元组,如果您不打算动态更改它们的话。我在这里发布的代码无论哪种方式都可以工作,但如果值已经是元组,则速度会更快

>>> from collections import Counter
>>> D = {1:[[100,0],[22,1],[23,2]],
... 10:[[100,0],[232,0],[10,2],[11,2]],
... 22:[[5,2],[23,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, 2], [100, 0]]

“我如何才能达到这个结果?”首先,写一个非常非常清楚的解释,说明一个人将如何逐步通过字典,比较这些“值对”以产生输出。请写一步一步的说明,很容易遵循。不是总结,而是一步一步(“先做这个,然后做那个”)。完成后,我们可以展示如何在用英语编写了一步一步的Python指令之后再编写它们。请用进行匹配的分步说明更新问题。如果可以使用元组列表,您可能会发现这更有效,例如,
[(100,0),(22,1),(23,2)]
是否输出所有出现多次的值对?订单重要吗?我明白你为什么有困难了。第一步是某种目标。它似乎暗示了一个循环,但没有说明它。步骤2似乎重复了步骤1。也许这两个步骤是循环的一部分。第三步不是一个步骤,而是对结果的另一个总结。这些都没有告诉我如何创建结果。请用铅笔在纸上做这个操作,并写下步骤。仍然很难确定你在说什么。在这里巧妙地使用集合运算;)谢谢你的解决方案。我更喜欢这个,因为我的单子上有很多项目。谢谢你的提示,把它改成元组而不是列表。
>>> [list(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]]
order_session = {1:[[100,0],[22,1],[23,2]],10:[[100,0],[232,0],[10,2],[11,2]],22:[[5,2],[23,2],[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, 0], [23, 2]]