【问题标题】:Why the 'list' is resulting empty after getting appended with a deleted list?为什么在附加已删除列表后“列表”为空?
【发布时间】:2022-01-20 07:25:26
【问题描述】:

这是我的代码,谁能帮我解释一下为什么“long_band”会导致列表为空?

预期输出:[[9,10],[0,1,2,3,4,5,6,7],[18],[12]]

代码从这里开始:

arr = [1, 9, 3, 0, 18, 5, 2, 4, 10, 7, 12, 6]
len1 = len(arr)
long_band = list()
chain = list()

def band(i):
    chain.append(i)
    j = i+1
    if j in arr:
        band(j)
    else:
        #print(chain)
        #print(long_band)
        long_band.append([chain])
        #print(long_band)
        del chain[:]


def isHead(n):
    x = n-1
    if x in arr:
        None
    else:
        band(n)


for i in range(len1):
    isHead(arr[i])


print(long_band)

【问题讨论】:

  • 我猜,要么 band() 永远不会被调用,要么 band() 中的 else 部分没有运行。
  • 你能解释一下这段代码应该做什么吗?预期的输出没有明显的逻辑,代码本身显然不起作用,因此也不能作为解释。
  • no.. band() 被调用元素 9,0,18,12。我已经调试过了。
  • 在将名为 'chain' 的列表附加到列表 'long_band' 后,我正在删除它,不知道为什么 long_band 也会变空。
  • chain 中的值不会被复制,而只会附加对链的引用。当你清除链时,将只剩下一个空列表([]

标签: python list


【解决方案1】:

当前的问题是:

long_band.append([chain])
del chain[:]

您将 chain 对象 附加到列表中,然后立即将其清除。这也会清除列表中的对象,因为只有一个对象。将其附加到列表不会创建它的副本。


更大的问题是您的算法过于复杂。这是一个更简单的方法:

>>> arr = [1, 9, 3, 0, 18, 5, 2, 4, 10, 7, 12, 6]
>>> arr.sort()
>>> res = [arr[0:1]]
>>> for i, j in zip(arr, arr[1:]):
...   if i != j - 1:
...     res.append([])
...   res[-1].append(j)
... 
>>> res
[[0, 1, 2, 3, 4, 5, 6, 7], [9, 10], [12], [18]]

【讨论】:

  • 也非常感谢你的新代码。但我想尝试这个问题而不对数组进行排序。你能告诉我如何将“链”对象值复制到“long_band”并保留它们吗?
  • 非常感谢,作业应该这样进行 long_band.append(chain[:]) 并且它确实有效:) :)
【解决方案2】:
arr = [1, 9, 3, 0, 18, 5, 2, 4, 10, 7, 12, 6]
len1 = len(arr)
long_band = list()
chain = list()

def band(i):
    chain.append(i)
    j = i+1
    if j in arr:
        band(j)
    else:
        long_band.append(chain[:])
        del chain[:]


def isHead(n):
    x = n-1
    if x in arr:
        None
    else:
        band(n)


def FindMaxLen(long_band):
    maxLength = max(len(x) for x in long_band)
    print(maxLength)


for i in range(len1):
    isHead(arr[i])


print(long_band)
FindMaxLen(long_band)

【讨论】:

  • 请添加一些 cmets。你用这个新代码解决了你的问题吗?
  • 是的..问题已解决
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-29
  • 2023-02-19
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
相关资源
最近更新 更多