<p>一个简单易读的解决方案是首先对列表进行排序,然后直接索引所需的值。我添加了一个<code>unique</code>参数,该参数指定是查看数值(最直观的)还是在列表中保留重复值(因此<code>[1,2,2]</code>中第二高的数值是<code>2</code>)</p>
<pre class="lang-py prettyprint-override"><code>def second_lowest_and_highest_using_sort(nums, unique=True):
if unique:
nums = list(set(nums))
if len(nums) == 1:
raise ValueError('Second lowest/highest number is undefined for a list of length 1.')
nums = sorted(nums)
return (nums[1], nums[-2])
</code></pre>
<p>没有先排序的更详细的方法:</p>
<pre class="lang-py prettyprint-override"><code>def second_lowest_and_highest(nums, unique=True):
if unique:
nums = list(set(nums))
if len(nums) == 1:
raise ValueError('Second lowest/highest number is undefined for a list of length 1.')
lowest, highest = float('inf'), float('-inf')
second_lowest, second_highest = None, None
low_delta, high_delta = float('inf'), float('inf')
for num in nums:
low_delta_new = num - lowest
if low_delta_new < 0:
second_lowest = lowest
lowest = num
elif low_delta_new <= low_delta:
second_lowest = num
low_delta = low_delta_new
high_delta_new = num - highest
if high_delta_new > 0:
second_highest = highest
highest = num
elif high_delta_new <= high_delta:
second_highest = num
high_delta = high_delta_new
return (second_lowest, second_highest)
</code></pre>