问题描述
||
更新:
再一次问好。我的问题是,如何比较字典的值是否相等。有关我的词典的更多信息:
关键是会话号
每个键的值是嵌套列表-> 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]]