我在使用Python中的列表时遇到了一种奇怪的行为。我已经实现了一个返回整数列表列表的方法;特别是,这些是图表中的循环,每个循环包括三个节点:
simple_cycles = compute_cycles(graph)
这让我回复:
[[40000,20000,30000],[700,500,600],[600,500,700],..]
现在,我需要(1)命令列表的每个列表,然后,我需要(2)从整个列表中删除重复项,以及(3)我需要再次排序整个列表。然后,期望的结果可能如下所示:
[[500,600,700],[20000,30000,40000]]
任务(1)是通过在通过compute_cycles返回内部列表之前对内部列表进行排序来实现的。通过执行以下行获得任务(2)和(3):
cycles = dict((x[0], x) for x in simple_cycles).values()
这适用于处理的第一个图表。以下每个图都失败了,因为内部列表中的排序有时是错误的。我尝试了两次最后一次源代码行,第二次结果不是预期的。例如,我在第二次运行中得到x:
[29837921, 27629939, 27646591]
而不是
[27629939, 27646591, 29837921]
这导致选择29837921作为字典中的键而不是27629939.因此,使用sorted(x)的初始排序似乎已经是假的。但为什么呢?
我试图在我的程序之外重现这种行为,但我不能。在我的应用程序中,我正在解析这样的XML文档:
detector = MyParser()
handler = MyHandler()
handler.subscribe(detector.update)
detector.parse(filename, handler)
..
def parse(self, infile, handler):
parser = etree.XMLParser(target=handler)
etree.parse(infile, parser)
执行时,例如
detector = MyParser()
handler = MyHandler()
handler.subscribe(detector.update)
detector.parse(filename, handler)
detector.parse(filename, handler)
然后第二次运行的顺序是意外的。
我知道,我的源代码示例不能自己重现它,但也许我在使用列表时缺少一些基本的Python内容。
更新
以下是列表的创建:
from networkx import dfs_successors
def compute_cycles(graph):
cycles = []
for node in graph.nodes():
a = graph.successors(node);
for a_node in a:
b = graph.successors(a_node)
for next_node in b:
c = graph.successors(next_node);
if len(c) > 1:
if c[0] == node:
cycles.append(sorted([node, a_node, next_node]))
elif c[1] == node:
cycles.append(sorted([node, a_node, next_node]))
else:
if c == node:
cycles.append(sorted([node, a_node, next_node]))
#fi
#rof
#rof
#rof
return cycles
更新
如果犯了一个大错:我已经覆盖了图中使用的Node对象的__repr__
函数,因此它返回一个整数。也许,排序失败是因为我正在处理真实对象而不是整数。我用这种方式将调用改为sort
函数:
cycles.append(sorted([node, a_node, next_node], key=lambda revision: revision.rev.revid))
我必须看看这是否有所作为。节点类定义如下:
class Node(object):
def __init__(self, revision, revision_hash):
self.rev = revision
self.revhash = revision_hash
def __repr__(self):
return repr((self.rev.revid))
答案 0 :(得分:3)
我不明白你为什么要使用dict
。
print sorted(set(tuple(sorted(x)) for x in L))
答案 1 :(得分:1)
词典不一定保持秩序。他们可以改变它。把它放在解释器中:{'a': 1, 'b': 2, 'c': 3}
。我得到{'a': 1, 'c': 3, 'b': 2}
。
答案 2 :(得分:0)
我的问题终于解决了。因为我将对象放在列表而不是简单的Integers
中,所以我必须使用sort
方法,如下所示:
sorted([node, a_node, next_node], key=lambda revision: revision.rev.revid))
在这里,我正在访问包含Integer
的成员变量,该变量已由__str__
返回。但是,排序时的隐式转换不稳定。