排序数字列表不适用于for循环

时间:2016-01-30 11:19:36

标签: python list python-2.7 sorting

我有一个数字列表:

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

2 个答案:

答案 0 :(得分:1)

功能pop()删除,并在索引len(list)-1中返回列表中的 last 项。致电pop(0) 会删除 第一个项,因此如果您反复调用它,那么您的列表将按顺序打印 ,这意味着{ {1}}因为你先排序了它。

请阅读documentation

1, 2, 3, 4 ,5
  

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

如果您没有希望删除列表中的项目,只需打印它们,则可以使用list.pop([i]) 代替print (list[index])。在你的循环中,由于它是从1排序并开始的,你实际上甚至可以使用pop()

答案 1 :(得分: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))