Python 返回列表中的第二大
这是我从列表中获取第二大元素的代码。 我假设一个列表至少有两个元素。 但是,它从下面的输入中给出的是“gamma”而不是“delta”Python 返回列表中的第二大,python,python-3.x,Python,Python 3.x,这是我从列表中获取第二大元素的代码。 我假设一个列表至少有两个元素。 但是,它从下面的输入中给出的是“gamma”而不是“delta” def second_largest(nums): the, sec = 0, 0 if nums[0] > nums[1]: the, sec = nums[0], nums[1] else: the, sec = nums[1], nums[0] for num in nums:
def second_largest(nums):
the, sec = 0, 0
if nums[0] > nums[1]:
the, sec = nums[0], nums[1]
else:
the, sec = nums[1], nums[0]
for num in nums:
if num > sec:
if num >= the:
the, sec = num, the
else:
sec = num
return sec
您已按适当的顺序将最大值和第二大值初始化为前两项,但随后将它们再次包含在循环中。如果最大值也是前两个值之一,则它将占用该点之后的两个插槽。您可以通过显式地从列表中创建迭代器并为前两个元素推进它来修复它:
print(second_largest(['alpha', 'gamma','beta','delta']))
通过不使用索引访问,这还具有处理任何iterable的优点
对于实际使用,请参阅,它甚至在CPython中对少量元素进行了特定的优化。一个简单的方法是找到max并删除它。查找最大值在o(n)上 第二次:
>>> x=['alpha', 'gamma','beta','delta']
>>> m=x[0]
>>> for i in x:
if i > m:
m=i
>>> x.remove(m)
o(n)+…+o(n)->L*o(n)->o(n)好吧,把你的算法写在纸上。你得到了什么?为什么不把
排序(['alpha','gamma','beta','delta',reverse=True)[1]
?@zwer:时间和空间复杂度更高。@zwer:谁说这还为时过早?无论如何,这是一个以获得O(n)为目标的家庭作业,这是一个更好的机会。如果我们使用内置优化,请参见heapq.nlagest
这是否按预期工作<代码>第二大(['alpha','gamma','beta','delta','echo'])返回echo
@cricket\u 007:是的,因为“g”在“e”之后。嗯。我想时间不早了;)
>>> x=['alpha', 'gamma','beta','delta']
>>> m=x[0]
>>> for i in x:
if i > m:
m=i
>>> x.remove(m)
>>> m=x[0]
>>> for i in x:
if i > m:
m=i
>>> print(m) #scond max