【问题标题】:Largest 3 numbers in a sequence序列中最大的 3 个数字
【发布时间】:2020-09-22 05:52:08
【问题描述】:

我正在尝试找出序列中最大的 3 个值,但从我的代码中我不明白是否要输入 maximum_three([9,6,4,1,2,3,10,8,7 ]),它会给出 [6, 9, 10] 而不是 [8,9,10] 的答案。根据我的理解,根据我的代码,我将让 maximum_3 成为序列中的某个随机数,如果该数字与 maximum_2 和最大的值不同,它将替换当前的 maximum_3 数字。但是从这段代码中,如果有重复的数字,我的代码将无法工作。如何重写我的代码,以便我的代码能够找出序列中最大的三个数字并允许重复的最大数字?

允许我创建一个元组来返回我的答案和一个列表,并且不允许修改原始序列。

def largest_three(seq):
    largest = seq[0]
    largest_2 = seq[0]
    largest_3 = seq[1]
    answer = []
    for num,item in enumerate(seq):
        if seq[num] > largest:
            largest = seq[num]
 
    for num,item in enumerate(seq):
        if seq[num] > largest_2 and not largest:
            largest_2 = seq[num]
            
    for num,item in enumerate(seq):
        if seq[num] > largest_3 and not largest_2 and not largest:
            largest_3 = seq[num]
    answer.append(largest_3)
    answer.append(largest_2)
    answer.append(largest)
    return answer

【问题讨论】:

  • 如果您明确对列表的前三个数字进行排序,您的算法将起作用。我怀疑你的意思是largest_3 = seq[2] 而不是seq[1]
  • 我认为您还指的是and seq[num] != largest 而不是and not largest(第三个循环也是如此)。
  • 如果我的回答对您有帮助,请告诉我,谢谢!

标签: python python-3.x list tuples sequence


【解决方案1】:

对于一个相对简单的任务来说,这需要大量代码。实际上,您可以使用更简洁的代码来做到这一点,方法是对列表的副本进行排序并仅返回最后三个值。

oldList 参数显然是您要检查的列表。对于其他两个参数(默认为 true),allowDupes 将在获取最高三个值时留下重复项(否则将被删除),highToLow 以降序返回最高条目(否则升序) :

def largest_three(oldList, allowDupes = True, highToLow = True):
    # Copy to sorted list either with or without duplicates.

    if allowDupes:
        sortedList = list(oldList)
    else:
        sortedList = list(set(oldList))

    # For high value first, reverse sort and return tuple of first three.

    if highToLow:
        sortedList.sort(reverse = True)
        return tuple(sortedList[:3])

    # Otherwise, normal sort and return tuple of last three.

    sortedList.sort(reverse = False)
    return tuple(sortedList[-3:])

# Test harness.

print(largest_three([9,6,4,1,2,3,10,8,7]))
print(largest_three([9,6,9,9,9,9,9,4,1,2,3,10,8,7]))
print(largest_three([9,6,9,9,9,9,9,4,1,2,3,10,8,7], False))
print(largest_three([9,6,9,9,9,9,9,4,1,2,3,10,8,7], highToLow = False))
print(largest_three([9,6,9,9,9,9,9,4,1,2,3,10,8,7], False, False))

正如预期的那样:

(10, 9, 8)
(10, 9, 9)
(10, 9, 8)
(9, 9, 10)
(8, 9, 10)

此代码涵盖了所有您的要求(如果您始终允许重复,它甚至涵盖了该要求):

  • 返回最大的三个值(是否重复);
  • 不修改原始列表;
  • 只创建一个额外的列表和一个返回的元组(除非您需要删除重复项,在这种情况下它还会创建一个集合)。

【讨论】:

  • 如果最大的三个值不按顺序怎么办? [10, 7, 6, 5, 3, 2, 1] - 根据 OP - 应该返回 [5, 6, 7] 而不是 [6, 7, 10]
  • @Chase:“序列中最大的 3 个值”[10, 7, 6, 5, 3, 2, 1]6, 7, 10不是 5, 6, 7。我不确定你为什么认为后者是正确的,OP 根本没有提到这种情况。
  • @Chase 我想你误解了 OP 的意思。输入列表中提到的“序列”OP。
【解决方案2】:

您的代码有两个问题:

  1. 初始化最大的 3 个数字时,您应该
largest = seq[0]
largest_2 = seq[1] # the index here was 0
largest_3 = seq[2] # the index here was 1
  1. 在您的第二个和第三个 for 循环中,第一个 if 语句条件是正确的,但它后面的条件不正确。 not largest 对于任何 int largest 如果 int 不为 0,则仅返回 true。您应该改用它:
if seq[num] > largest_2 and seq[num] != largest:

if seq[num] > largest_3 and seq[num] != largest_2 and seq[num] != largest:
  1. 最后,您的函数将在上述两个更改后工作:
def largest_three(seq):
    largest = seq[0]
    largest_2 = seq[1]
    largest_3 = seq[2]
    answer = []
    for num, item in enumerate(seq):
        if seq[num] > largest:
            largest = seq[num]

    for num, item in enumerate(seq):
        if seq[num] > largest_2 and seq[num] != largest:
            largest_2 = seq[num]

    for num, item in enumerate(seq):
        if seq[num] > largest_3 and seq[num] != largest_2 and seq[num] != largest:
            largest_3 = seq[num]
    answer.append(largest_3)
    answer.append(largest_2)
    answer.append(largest)
    return answer

控制台:

>>> largest_three([9, 6, 4, 1, 2, 3, 10, 8, 7])
[8, 9, 10]

如果你允许使用sorted,最简单的方法:

res = sorted([9, 6, 4, 1, 2, 3, 10, 8, 7], reverse=True)[:3]

【讨论】:

  • sorted 方法如果不特别注意最大三个数字不按顺序排列的列表将无法工作
  • @Chase,你需要解释清楚一点,因为排序是它们按顺序排列。
  • @paxdiablo 我认为按顺序最大的意思是最大的 3 个值,它们也是按数字顺序排列的
  • @Chase,我从您对我的回答的评论中假设您的意思是连续的,而不是按数字顺序,因为 100、200、300 满足后者但不满足前者。无论如何,我不认为这是正确的解释,OP 只要求最大的三个值。
  • 我不热衷于(1)在简单排序时迭代列表三次; (2) 仅使用 index.html 时枚举索引和键。但我几乎不能为此投反对票,因为这是问题:-)
【解决方案3】:

我建议使用numpy.partition,这正是您想要的。查看文档here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 2017-04-12
    相关资源
    最近更新 更多