比较字典值在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。
如果你的词典是漫长的,你会想用套,获得更好的性能(在列表中查找已经遇到的值将是相当缓慢):
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
我也建议(再次,出于性能原因)将元组嵌套到列表中而不是列表中,如果您不打算立即更改它们的话。我在这里发布的代码将以任何方式工作,但如果这些值已经是元组,它会更快。
有可能做到这一点一个更好的和更优化的方式,但我的工作我的方式从这里:
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]]
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]]
列表 “我怎样才能实现这个结果?”首先,写一个更加清晰的解释,说明一个人如何通过字典,比较这些“值对”来产生输出。请撰写分步指导,这些指导非常简单。不是一个总结,而是一步一步的(“先做这件事,然后做下一件事”)。当你这样做的时候,我们可以展示如何在用英文写他们之后用Python编写分步说明。请**更新**问题,并按照分步说明进行此匹配。 – 2011-05-24 10:31:02
你可能会发现,如果你可以使用元组列表,例如。 '[(100,0),(22,1),(23,2)]' – 2011-05-24 10:35:32
是不止一次出现的所有值对的输出?订单重要吗? – 2011-05-24 10:37:07