<p><sup>一个旧问题,但添加一个答案以便获得帮助</p>
<p>这确实是来自<a href="https://hackerrank-challenge-pdfs.s3.amazonaws.com/1375-nested-list-English?AWSAccessKeyId=AKIAJ4WZFDFQTZRGO3QA&Expires=1554282259&Signature=pVDlEp27WwtZWjA%2FcghAFq5wasI%3D&response-content-disposition=inline%3B%20filename%3Dnested-list-English.pdf&response-content-type=application%2Fpdf" rel="nofollow noreferrer">hackerrank</a>的一个面试问题。</p>
<p>下面是我对这个问题的简单解决方案-我只需遍历嵌套的成绩列表。在每次迭代中,将新的得分与<code>lowest</code>得分和第二低得分(<code>slowest</code>)进行比较,同时保持一个<code>names</code>列表,其中得分等于第二低得分。</p>
<p>注:<code>names</code>总是与<code>slowest</code>分数相关,如果<code>slowest</code>改变,我们也改变<code>names</code>。如果新分数等于<code>slowest</code>分数,则添加新名称。评论将帮助你进一步。。。</p>
<pre><code>def second_lowests(grades):
"""
returns list of names of students with second lowest score
"""
# intialize the `lowest` and second lowest `slowest` score and names
grades = iter(grades)
lname, lowest = next(grades)
slname, slowest = next(grades)
if slowest < lowest:
lowest, slowest = slowest, lowest
names = [lname]
elif slowest == lowest: # we don't know, if lowest can be second lowest!
names = [lname, slname]
else:
names = [slname]
for name, score in grades:
if score == slowest:
names.append(name)
continue
if score == lowest:
continue
if score < lowest:
if slowest == lowest:
pass
else:
names = [lname]
lowest, slowest = score, lowest
lname = name
elif score < slowest:
slowest = score
names = [name]
elif score > slowest and slowest == lowest:
slowest = score
names = [name]
if slowest == lowest: # all have same score
return []
names.sort()
return names
if __name__ == '__main__':
nested_list = []
for _ in range(int(raw_input())):
name = raw_input()
score = float(raw_input())
nested_list.append([name, score])
assert 2 <= len(nested_list) <= 5
print ("\n".join(second_lowests(nested_list)))
</code></pre>
<p>我不知道这是否是一个更好的解决方案,但它通过了所有的测试用例。</p>