2011-05-24 98 views
1

更新:比较字典值在Python在同一个字典的每个键

大家好。我的问题是,我如何比较字典的值是否相等。更多信息详细信息我的字典:

  • 键会话号每个按键的
  • 值嵌套的列表 - > F.E.

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

  • 值的每个键的长度的arent一样的,所以它可能是会话编号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

感谢您对所有您的帮助和提示,以更改列表的嵌套列表到元组,这是相当更好地处理它的名单。我也喜欢使用collections.Counter()...不幸的是,我使用2.6.4(计数器工作在2.7),也许我有时会改为2.7。

+1

列表 “我怎样才能实现这个结果?”首先,写一个更加清晰的解释,说明一个人如何通过字典,比较这些“值对”来产生输出。请撰写分步指导,这些指导非常简单。不是一个总结,而是一步一步的(“先做这件事,然后做下一件事”)。当你这样做的时候,我们可以展示如何在用英文写他们之后用Python编写分步说明。请**更新**问题,并按照分步说明进行此匹配。 – 2011-05-24 10:31:02

+1

你可能会发现,如果你可以使用元组列表,例如。 '[(100,0),(22,1),(23,2)]' – 2011-05-24 10:35:32

+0

是不止一次出现的所有值对的输出?订单重要吗? – 2011-05-24 10:37:07

回答

2

如果你的词典是漫长的,你会想用套,获得更好的性能(在列表中查找已经遇到的值将是相当缓慢):

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,0],[232,0],[10,2],[11,2]],22:[[5,2],[23,2]]} 
for x in get_repeated_values(sessions): 
    print x 

我也建议(再次,出于性能原因)将元组嵌套到列表中而不是列表中,如果您不打算立即更改它们的话。我在这里发布的代码将以任何方式工作,但如果这些值已经是元组,它会更快。

+0

这里聪明地使用set操作;) – peufeu 2011-05-24 10:54:00

+0

谢谢你的解决方案。我更喜欢这个,因为我列表中有很多项目。并感谢提示将其更改为元组而不是列表。 – SnowBallz 2011-05-24 19:51:52

0

有可能做到这一点一个更好的和更优化的方式,但我的工作我的方式从这里:

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 = 5b = 5,则ab将指向相同的整数对象。但是,如果您将它们设置为10^5,则它们不会。但我不知道限制在哪里,所以我不确定这是否适用于您的代码。

0
>>> 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]] 
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]]