如何从嵌套列表中删除循环(无限)符号?

2024-04-20 09:43:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个递归函数,它从一组边生成一个路径列表。但是,有时由于图形的性质,它进入循环并生成包含列表中无限循环符号[…]的字典,例如:

{('a', 'b'): [[1, 2, 8, 9, 18, 6, 5], [...], [1, 2, 7, 5], [1, 4, 3, 10, 9, 18, 6, 5]]}

当然,当我的程序在这个输出字典上循环并遇到“[…]”时,会产生以下错误

a = {('a', 'b'): [[1, 2, 8, 9, 18, 6, 5], [...], [1, 2, 7, 5], [1, 4, 3, 10, 9, 18, 6, 5]]}
                                                         ^
SyntaxError: invalid syntax

因为我不知道该怎么称呼“[…]”。我在Google上的搜索没有得到任何有用的结果。你知道吗

我想知道有没有办法从列表中删除[…],例如从上一个示例生成以下词典:

{('a', 'b'): [[1, 2, 8, 9, 18, 6, 5], [1, 2, 7, 5], [1, 4, 3, 10, 9, 18, 6, 5]]}

如有任何反馈,我将不胜感激。你知道吗


Tags: 路径程序图形示例列表字典错误google
2条回答

这并不是你所想的,[...]意味着相同的列表被添加到原始列表中,如下所示:

a = [1, 2, 3]
a.append(a)
[1, 2, 3, [...]]

所以问题是你创建了你的列表,你应该修正你的逻辑。我是说那样做更好。但试试这个,可能会有帮助:

your_dict[('a','b')].remove(your_dict[('a','b')])

如果找到循环元素,可以用循环元素替换.remove(your_dict[('a','b')])。你知道吗

Python没有像commonlisp的“print circle”这样的选项,它允许循环数据结构的序列化和反序列化;如果需要的话,还有pickle模块。你知道吗

如果只需要自定义序列化而不需要反序列化来重建完整的数据结构,则可以保留一组已找到的成员:

def serialize(x, known=None): 
    if known is None: known = set() 
    if isinstance(x, list): 
        if id(x) in known: 
            return "[-1]" 
        else: 
            known.add(id(x)) 
            res = "[" + ",".join(serialize(y, known) for y in x) + "]" 
            known.remove(id(x)) 
            return res 
    else: 
        return repr(x)

在上面的代码中,我将输出[-1],在那里会出现一个back引用。你知道吗

如果您还希望能够在自定义序列化中重建原始结构(包括循环),那么代码要稍微复杂一些。基本上是你

  1. 为找到的每个新列表指定一个唯一的编号
  2. 当您看到一个已知的列表时,您将列表引用号存储在流中,而不是递归
  3. 您永远不会从known字典映射列表中删除元素到引用号

在反序列化过程中,您需要构建相同的引用号映射,当满足引用时,您只需从映射中选择列表(如果您找到已经满足的引用号,则可以保证列表已经满足)。唯一需要注意的是,无论是序列化还是反序列化,都需要在递归之前将列表放到映射中。你知道吗

相关问题 更多 >