【问题标题】:Python, understanding list-comprehensionPython,理解列表理解
【发布时间】:2026-01-29 19:45:01
【问题描述】:

我正在学习数据结构,我想将堆栈中的数据放入列表中,我使用此代码做到了

data_list=[Stack1.pop() for data in range(Stack1.get_top()+1)]

现在这确实实现了。但我想知道

  • 即使变量 'data' 没有在表达式 'Stack1.pop()' 中使用,理解仍然有效。请解释它正在使用一个示例,其中变量未在表达式中使用。

  • 这种方法是否适用于堆栈、队列?

【问题讨论】:

  • re:“这种方法是否好”——如果get_top() 有它的传统含义,那么没有。不过,您需要更详细地描述Stack1,以便任何人都能正确回答。它是什么类型,该类型支持什么方法,它们是做什么的,内容是什么等等。
  • get_top() 方法是常规的,Stack1里面有整数作为数据
  • 在这种情况下,如果堆栈顶部的值恰好是堆栈的大小 - 1,listcomp 只会巧合地起作用。
  • 回答你的问题,虽然这个列表理解有时并且只是偶然地起作用,但是在你不使用的 listcomp 中有一个变量是可以的。按照惯例,这个变量通常称为_,表示它实际上并没有被使用。
  • 哦,谢谢你的指点,它回答了我的问题。

标签: python-3.x list-comprehension


【解决方案1】:

与任何列表理解一样,您可以将代码修改为等效的 for 循环,并重复调用 append

data_list = []
for _ in range(Stack1.get_top()+1):
    data_list.append(Stack1.pop())

代码有效(我假设)因为get_top 返回的堆栈大小比堆栈大小小一。但它确实有一个副作用,就是清空堆栈,这可能是也可能不是你想要的。

使用堆栈中的项目更自然的方法是使用while 循环:

while not some_stack.is_empty():
    item = stack.pop()
    do_something(item)

while 循环的优点是,如果do_something 修改堆栈(通过推送新值或弹出其他值),它仍然可以工作。

最后一点:在 Python 中通常不需要使用特殊的堆栈类型。列表具有从列表末尾到 append()pop()O(1) 方法。如果您希望列表中的项目按照 popped 的顺序排列,您可以使用 list.reverse() 方法(原地反转)、reversed 内置函数(获得反向迭代器)来反转它) 或“外星人笑脸”切片(some_list[::-1]; 获取列表的反向副本)。

【讨论】:

  • 我了解“while”循环方法,但我想知道。 list1=[ for in ] 如果 没有在 中使用,可以吗?如果是,请举例说明。谢谢
  • 允许不使用表达式中的变量。这是否是一个好主意有点模棱两可。您会经常看到它带有 ranges 和名为 _ 的变量(表示您不关心它的值)。