当前位置: 首页 > 知识库问答 >
问题:

如何从列表中找到数字的中值?蟒蛇

简俊楚
2023-03-14

我试图在列表中找到中位数。找到中位数的等式是 N 项/2。我尝试的代码是查找并索引该数字,但是当我索引时,我得到0或错误,为什么会这样?

def Median():
#MedianList_Str = ""
MedianList = [2,4,6]
print("What number do you want to add to the array, enter 0 to exit")
try:
    Int = int(input())
    if Int == 0:
        QuitApp()
    else:
       MedianList.append(Int)
except:
    print("Please enter a number")

MedianT = math.floor(len(MedianList)/2) #finds the nth term 
MedianList.sort #sorts the list so you can find the median term
MedianList_Str.join(MedianList)

这就是我所做的我还尝试了索引

def Median():
MedianList_Str = ""
MedianList = [2,4,6]
print("What number do you want to add to the array, enter 0 to exit")
try:
    Int = int(input())
    if Int == 0:
        QuitApp()
    else:
       MedianList.append(Int)
except:
    print("Please enter a number")

MedianT = math.floor(len(MedianList)/2) #finds the nth term 
MedianList.sort #sorts the list so you can find the median term
print(MedianList.index(MedianT))

这让我得到0

我怎样做才能得到中位数?我知道已经存在这样一个问题,但我想尝试一种不同的方法。

共有3个答案

秦飞航
2023-03-14

如果数组的长度是偶数,则中位数或者是中间元素的值,或者是中间两个元素的平均值。

因此,首先我们必须对数组进行排序,然后应用我们的逻辑。

def median(l):
    l = sorted(l)
    middle = len(l) // 2
    return l[middle] if len(l) % 2 == 1 else (l[middle - 1] + l[middle]) / 2

请注意,存在更有效的算法来查找中值,这些算法花费< code>O(n)时间,而不是< code>O(n log n)时间,但是它们实现起来并不容易,并且在Python的标准库中也不可用。

卜方伟
2023-03-14

正如其他人提到的,我将使用排序(中间点),而不是MeadianT.sort()

此外,使用基于数组的索引而不是 .index() 函数。
例如,这个:

print(MedianList[MedianT])

取而代之的是:

print(MedianList.index(MedianT))

我在下面的评论中包括了在Python中查找数组中位数的逻辑和思维过程。

def median(array):
    length = len(array)
    sorted_arr = sorted(array) # sorting in O(n) time or linear complexity
    # we are subtracting 1 from overall 
    # length because indexing is 0-based
    # essentially indexes of arrays start at 0
    # while counting length starts at 1
    # idx_norm = (length-1) / 2 # using only single division operator yields a float
    idx = (length-1) // 2 # using floor division operator // yields an Int which can be used for index

    # we run a simple condition to see 
    # whether if the overall length of array
    # is even or odd.
    # If odd then we can use index value (idx) to find median
    # we use modulus operator to see if if there is any remainder
    # for a division operation by 2. If remainder equals 0 then
    # array is even. If not array is odd.
    if length % 2 == 0:
        return (sorted_arr[idx] + sorted_arr[idx + 1]) / 2.0 # if you need an Int returned, then wrap this operation in int() conversion method
    else:
        return sorted_arr[idx]
    # If even we have to use index value (idx) and the next index value (idx + 1)
    # to create total and then divide for average

a = [1, 2, 3, 4, 12, 1, 9] # 7 elements, odd length --> return 3
b = [2, 3, 7, 6, 8, 9] # 6 elements, even length --> return 6.5

median(a)
median(b)

如果您有任何问题,请告诉我,希望这有所帮助。干杯!

钱跃
2023-03-14

这里有一个很好的技巧,可以避免使用if/else分别处理奇数和偶数长度的情况:中间的索引是(len(nums) - 1)// 2len(nums) // 2。如果长度为奇数,则这些索引相等,因此将值相加并除以 2 不起作用。

请注意,您应该使用//运算符进行地板除法以获得一个用作索引的整数。

def median(nums):
    nums = sorted(nums)
    middle1 = (len(nums) - 1) // 2
    middle2 = len(nums) // 2
    return (nums[middle1] + nums[middle2]) / 2

例子:

>>> median([1, 2, 3, 4])
2.5
>>> median([1, 2, 3, 4, 5])
3.0
 类似资料:
  • 问题内容: 我想对数字求和,以便得到列表。 我尝试了以下方法: 问题答案: 如果你要对像这样的数组做大量的数值工作,我建议使用,它带有一个累加和函数: 在这种情况下,Numpy通常比纯python更快,请参阅与@Ashwini的accumu比较: 但是,当然,如果这是你唯一使用numpy的地方,则可能不值得依赖它。

  • 问题内容: 如何在Python中获取字典中的值列表? 在Java中,将Map的值作为列表获取就像在操作中一样容易。我想知道Python中是否有类似的简单方法可以从字典中获取值列表。 问题答案: 是的,这与Python 2 完全相同: 在Python 3中 (在其中返回字典值的 视图 ):

  • 问题内容: 有什么简单的方法或功能可以确定python列表中的最大数量?我只可以编写代码,因为我只有三个数字,但是如果我可以使用内置函数或类似的东西告诉最大的代码,那么它将使代码的冗余度降低很多。 问题答案: 关于什么

  • 问题内容: 如何以pythonic方式从排序列表中找到缺失的号码? 我看过这篇文章,但是有没有更有效的方法呢? 问题答案: 或者(使用AP系列公式的总和) 对于可能缺少多个数字的一​​般情况,可以制定O(n)方法。

  • 我有以下代码: LR是类的列表类型。在这个列表中,我有15个索引,例如在索引[0]中,我有: 现在在这个索引[0]中,我有两个int的变量end 88和start 96 在这个for循环中,我需要做的是: _fts是一个<代码>列表 我有两个错误: 错误31“系统”的最佳重载方法匹配。集合。通用。列表。添加(int)”有一些无效参数 和 错误32参数1:无法从“Lightings\u提取器”转换。

  • 这个问题似乎与帮助中心定义的范围内的编程无关。 我想从原始字符串数组中获得一个没有重复值的新字符串数组。例如,如果原始数组是{a b b b c d, a a b b c, a b c c},我的新字符串不应该包含重复值。我根本无法弄清楚,因为不同线程中的所有解决方案都讨论单个字符串数组,而不是像这样的多个字符串数组。我不知道我是否必须使用。拆分函数并添加到hashset,然后将其添加回我创建的新