【问题标题】:Python- Quickselect function finding the medianPython-快速选择函数找到中位数
【发布时间】:2013-10-09 05:26:51
【问题描述】:

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

Offices 70
MedicalOffice  120
PostOffice 170
Mall 200

它被导入到一个列表中:

L = ['70', '120', '170', '200']

当它运行 quickselect 函数时,它会打印出经过的时间是一个奇数,每次像 1.9083486328125e-06 之类的东西都会发生变化......首先这是什么时间值,以毫秒为单位?当函数运行并返回枢轴时,它会吐出:

>>> 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))   

【问题讨论】:

  • 如果你想知道为什么'200' 是一个中位数,看看结果sorted(L) :-)

标签: python list indexing quickselect


【解决方案1】:

time() 方法将自纪元以来经过的秒数返回为浮点数。为了从特定开始时间打印出经过的时间(以秒为单位),您需要设置您的start_time = time.time()。然后你可以用time.time() - start_time 的差来得到经过的时间,以秒为单位。

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

L.append( int(locations) )

【讨论】:

  • 好的,谢谢,但是你知道为什么代码没有选择中位数吗?
  • 我认为您需要将数据转换为整数。请参阅上面的更新答案。
  • 感谢您对我的帮助很大
  • 如果有偶数个整数,有没有办法找到两者之间的平均值?
猜你喜欢
  • 2021-08-24
  • 1970-01-01
  • 2021-06-11
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
相关资源
最近更新 更多