【问题标题】:Sort list of numbers doesn't work with for loop [closed]数字排序列表不适用于 for 循环[关闭]
【发布时间】:2016-01-30 11:19:35
【问题描述】:

我有一个数字列表:

list = [2, 5, 4, 1, 3]

我想对其进行排序并使用 for 循环迭代排序列表:

print list
list.sort()
print list
for n in list:
    print list
    print n
    list.pop(0)

但输出看起来不像预期的那样:

# before sort:
[2, 5, 4, 1, 3]
# after sort:
[1, 2, 3, 4, 5]
## still everything ok
# for loop:
[1, 2, 3, 4, 5]
1
[2, 3, 4, 5]
3
[3, 4, 5]
5
## what?

为什么 for 循环不接受排序列表并使用之前的状态,即使它返回排序列表?是否有任何隐藏的索引,sort() 无法更改?我是 Python 新手,这真的很奇怪。我做错了什么?

我想要达到的目标:

# before sort:
[2, 5, 4, 1, 3]
# after sort:
[1, 2, 3, 4, 5]
# for loop:
[1, 2, 3, 4, 5]
1
[1, 2, 3, 4, 5]
2
[1, 2, 3, 4, 5]
3
[1, 2, 3, 4, 5]
4
[1, 2, 3, 4, 5]
5

更新:我需要那个弹出窗口。我这个函数的完整代码:

inTemplate = [False]
inLink = [False]
regexNeeded = [False, True]
# ...some if elif else skipped there
            # finds positions of brackets and sorts them
            brackets = [m.start() for m in re.finditer("}}",text)]
            brackets += [m.start() for m in re.finditer("{{",text)]
            brackets += [m.start() for m in re.finditer("]]",text)]
            brackets += [m.start() for m in re.finditer(r"\[{2}",text)]
            brackets.sort(key=int)
            # if any bracket in text
            if not brackets == []:
                # for every bracket
                for n in brackets:
                    # what bracket and what starts/ends with it
                    if text[n] == '{':
                        inTemplate.append(True)
                    elif text[n] == '[':
                        inLink.append(True)
                    elif text[n] == ']':
                        inLink.pop()
                    else:
                        if inTemplate[-1]:
                            inTemplate.pop()
                        # if ends template which doesn't started, then there is no need to regex
                        elif regexNeeded[-1]:
                            regexNeeded.pop()
                        # break if out of regexNeeded area
                        else:
                            break
                    brackets.pop(0)
                # if for loop breaked
                if not brackets == []:
                    # do some regex on that bracket, where for loop breaked
                    where = brackets[0]
                    before = text[:where]
                    before = re.sub(r'\s*$', r'\n', before)
                    after = text[where:]
                    if not regexNeeded[-1]:
                        after = re.sub(r'^}}\s*', r'}}\n', after)
                    text = before + after

【问题讨论】:

  • 我认为您只是错过了输出中的某些内容。它应该可以正常工作。
  • @cad 想知道什么?
  • @aleskva 然后删除 list.pop(0)
  • 为什么你认为排序有问题?
  • 为什么需要pop

标签: python list python-2.7 sorting


【解决方案1】:

使用 pop 会完全删除列表中的一个元素。因此引用被删除,我们只能迭代剩余项目的数量。代码在 Python 3 中,但我想更改打印语句应该不会太难。

list = [2, 5, 4, 1, 3]

print(list)
list.sort()
print(list)
for n in range(len(list)):
    print(list)
    print(list.pop(0))

【讨论】:

  • 看起来是个不错的解决方案,但如果我想在 for 循环中添加一些 if listItem == 21: 怎么办? (如果列表更大)
  • 只使用 list[n] == 21 @aleskva
【解决方案2】:

函数pop()删除并返回您在列表中的最后一个项,索引为len(list)-1。调用pop(0) 删除 第一个 项,所以如果你重复调用它,那么你的列表将被打印in-order,意思是1, 2, 3, 4 ,5因为你先排序了。

请阅读documentation

list.pop([i])

删除列表中给定位置的项目,并将其返回。

如果您希望删除列表中的项目,而只是打印它们,则可以使用print (list[index]) 而不是pop()。而在你的循环中,由于它是从 1 开始排序和开始的,你实际上甚至可以使用print(list[n-1])

【讨论】:

  • 我知道它的作用,但我需要它。我有更复杂的代码。请参阅我在问题下的评论。你知道吗,如何在 pop 还在的情况下解决这个问题?
  • 到底是什么问题?您可以使用 pop(0),它会按照您的意愿工作。
  • 我需要弹出,因为我在 for 循环中有一些复杂的 if elif else,它处理较小的列表并将它们与一些预定义的列表进行比较。所以我需要比较较小的列表,但仍然迭代原始列表。
  • 您必须附上一个完整的示例(也是最小且可验证的)。请使用所有详细信息编辑您的问题,然后您可能会以足够的票数重新打开它(如果清楚,我会投票)。然后我可以进一步帮助你:)
  • 我在代码中添加了一些 cmets
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 2021-02-20
  • 1970-01-01
  • 2019-01-29
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多