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
这是我从列表中获取第二大元素的代码。 我假设一个列表至少有两个元素。 但是,它给了我'伽玛'不是' delta'来自下面的输入。
print(second_largest(['alpha', 'gamma','beta','delta']))
答案 0 :(得分:6)
您已按照适当的顺序将最大和第二大值初始化为前两个项目,但之后您又将它们包含在循环中。如果最大值也是前两个值之一,则在该点之后将占用两个槽。您可以通过显式创建一个迭代器并为前两个元素推进它来修复它:
def second_largest(nums):
it = iter(nums)
sec, the = sorted((next(it), next(it)))
for num in it:
if num > sec:
if num >= the:
the, sec = num, the
else:
sec = num
return sec
通过不使用索引访问,这也具有处理任何可迭代的优势。
对于实际使用,请参阅heapq.nlargest
,它甚至在CPython中针对少量元素进行了特定优化。
答案 1 :(得分:0)
一种简单的方法是找到最大值并将其删除。找到最大值是o(n)
>>> 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
o(n)+ ... + o(n) - > L * o(n) - > o(n)