python列表似乎随机消失

时间:2016-03-15 16:17:43

标签: python arrays list function module

我制作了一个脚本来测试我编写的不同排序算法的运行时间。代码在这里:

import random
import sort
import time

print ('test sort functions for integer lists')
integers = [random.randint(1,999) for n in range(1, random.randint(1000,2000)) ]
print('ordering', len(integers), 'ints')

print('start selection sort')
ts=time.clock()
print(sort.selection(integers))
print ('end selection sort with time', time.clock()-ts, '\n')


print('start merge sort')
tm=time.clock()
print(sort.merge(integers))
print ('end merge sort with time', time.clock()-tm, '\n')

调用函数sort.merge(integers)时,由于某种原因会传递一个空列表。我通过放置print(integers)来测试这一点,但据我所知,应该与传递给sort.selection(integers)的列表完全相同。有人知道发生了什么事吗?

我的sort.py模块的内容:

import math

def merge(ints):
    if (len(ints) < 2):
        return (ints)
    else:
        print('recursion')
        i=merge(ints[0:math.ceil(len(ints)/2)]) #calls recursive function for
        j=merge(ints[math.ceil(len(ints)/2):])  #both halves of list
        k=[] #beginning of merge algorithm
        ic=0
        jc=0
        while (ic < len(i) and jc < len(j)):   #repeat as long as end of i
            if (i[ic] < j[jc]): #append lowest value to k
                k.append(i[ic])
                ic+=1 #track which values of i are accounted for
                if (ic == len(i)): #if i is exhausted
                    for a in range (jc, len(j)): #fill k with j
                        k.append(j[jc])
                        jc+=1
                    break
            if (i[ic] >= j[jc]):
                k.append(j[jc])
                jc+=1
                if (jc == len(j)):
                    for a in range (ic, len(i)):
                        k.append(i[ic])
                        ic+=1
                    break
        return (k) 

def selection(ints,order='a'):
    maxint=0
    orderedints=[]
    if (order == 'desc' or order == 'descending' or order == 'd'):
        while (len(ints) > 0):
            maxint=maxof(ints)
            ints.remove(maxint)
            orderedints.append(maxint)
        return (orderedints)

    if (order == 'asc' or order == 'ascending' or order == 'a'):
        while (len(ints) > 0):
            minint=maxof(ints)
            for i in range (0, len(ints)):
                if (ints[i] < minint):
                    minint = ints[i]
            ints.remove(minint)
            orderedints.append(minint)
        return (orderedints)

def maxof(a):
    maxint=0
    for i in range (0, len(a)):
        if (a[i] > maxint):
            maxint = a[i]
    return (maxint)

3 个答案:

答案 0 :(得分:1)

require('./public/style.scss')内,您正在呼叫sort.selection。由于ints.remove只是对ints引用的列表的另一个引用(不是副本),integers的副作用是在返回时清空输入列表它的分类副本。

答案 1 :(得分:1)

您的函数sort.selection正在修改列表,如下所示:

ints.remove(maxint)

如果要对列表的本地副本进行操作,请添加:

ints = ints[:]

早期sort.selection()例行程序。

答案 2 :(得分:0)

问题是sort.selection从它获取的列表中删除了值作为其参数。由于它返回新列表,您需要将该列表分配回变量。

更改此部分:

print(sort.selection(integers))

为:

integers = sort.selection(integers)
print(integers)