Python-Quickselect函数查找中间值

Python-Quickselect函数查找中间值,python,list,indexing,quickselect,Python,List,Indexing,Quickselect,因此,我开发了一个快速选择函数的代码,但它似乎没有打印出中间值。 我的主要功能是提示输入文件名,然后导入该txt文件,将其拆分为数字列表这是txt文件: Offices 70 MedicalOffice 120 PostOffice 170 Mall 200 它被导入到一个列表中: L = ['70', '120', '170', '200'] 当它运行quickselect函数时,它会打印出一个奇数,每次出现类似于1.9083486328125e-06的情况时都会更改。。。首先,以毫秒为

因此,我开发了一个快速选择函数的代码,但它似乎没有打印出中间值。 我的主要功能是提示输入文件名,然后导入该txt文件,将其拆分为数字列表这是txt文件:

Offices 70
MedicalOffice  120
PostOffice 170
Mall 200
它被导入到一个列表中:

L = ['70', '120', '170', '200']
当它运行quickselect函数时,它会打印出一个奇数,每次出现类似于1.9083486328125e-06的情况时都会更改。。。首先,以毫秒为单位的时间值是多少?当函数运行并返回pivot时,它会输出以下内容:

>>> main()
Enter a filename: Input.txt
['70', '120', '170', '200']
Time:  1.9073486328125e-06
200
有人能告诉我为什么它不起作用吗?代码如下:

import time

start_time = 0

def quickSelect(L, k):
   start_time = time.time() 
   if len(L) != 0:
      pivot = L[(len(L)//2)]
      smallerList = []
   for i in L:
        if i<pivot:
           smallerList.append(i)
   largerList=[]
   for i in L:
        if i>pivot:
           largerList.append(i)
   m=len(smallerList)
   count=len(L)-len(smallerList)-len(largerList)
   if k >= m and k < m + count:
       end_time = time.time()
       print("Time: ", end_time - start_time)
       return pivot
   elif m > k:
        return quickSelect(smallerList, k)
   else:
       return quickSelect(largerList, k - m - count)
def main():

    dataFilename = input('Enter a filename: ')

    dataFile = open(dataFilename)
    L = []
    for inputLine in dataFile:
        splittext = inputLine.split()
        place = splittext[0]
        locations = splittext[1]
        L += [locations]
    print(L)
    print(quickSelect(L, len(L)//2))   
导入时间
开始时间=0
def快速选择(L,k):
开始时间=time.time()
如果len(L)!=0:
pivot=L[(len(L)//2)]
smallerList=[]
对于L中的i:
如果ipivot:
追加(一)
m=len(小列表)
计数=len(L)-len(小列表)-len(大列表)
如果k>=m且kk:
返回quickSelect(小列表,k)
其他:
返回quickSelect(大列表,k-m-count)
def main():
dataFilename=input('输入文件名:')
数据文件=打开(数据文件名)
L=[]
对于数据文件中的inputLine:
splittext=inputLine.split()
位置=拆分文本[0]
位置=拆分文本[1]
L+=[位置]
印刷品(L)
打印(快速选择(L,len(L)//2))
time()方法以浮点形式返回自历元以来经过的秒数。为了从特定开始时间以秒为单位打印经过的时间,您需要设置
start\u time=time.time()
。然后,您可以取
time.time()-start\u time
的差值,以秒为单位获得经过的时间

至于函数不输出中值的原因,我首先要确保传递的是
quickSelect
整数列表。现在,您似乎正在传递字符串列表,因此
quickSelect
中的比较是在字符串对之间而不是整数之间进行的。试用

L.append( int(locations) )
time()。为了从特定开始时间以秒为单位打印经过的时间,您需要设置
start\u time=time.time()
。然后,您可以取
time.time()-start\u time
的差值,以秒为单位获得经过的时间

至于函数不输出中值的原因,我首先要确保传递的是
quickSelect
整数列表。现在,您似乎正在传递字符串列表,因此
quickSelect
中的比较是在字符串对之间而不是整数之间进行的。试用

L.append( int(locations) )

好的,谢谢,但是你知道为什么代码没有选择中间值吗?我想你需要把数据转换成整数。看到我上面更新的答案。谢谢你,这帮了我很大的忙。我是编程新手,它让人惊讶的是,最小的东西是如何改变一切的。如果有偶数的整数,有没有办法找到两者之间的平均数?好的,谢谢,但是你知道为什么代码没有选择中间值吗?我想你需要将数据转换成整数。看到我上面更新的答案。谢谢你,这帮了我很大的忙。我是编程新手,它让人惊讶的是,最小的东西是如何改变一切的。如果有偶数的整数,有没有办法找到两者之间的平均数?看结果
排序(L)
如果你想知道为什么
'200'
是一个中位数:-)看看结果
排序(L)
如果你想知道
'200'
为什么是中位数:-)