排名前十的结果

时间:2013-06-25 10:35:10

标签: python python-2.7 tuples

我正在获取一个列表,我将按以下方式保存结果

City Percentage
Mumbai  98.30
London 23.23
Agra    12.22
.....

列表结构是[[“Mumbai”,98.30],[“London”,23.23] ..]

我正在以列表的形式保存这些记录。我需要列表排序top_ten记录。即使我也得到了城市,也没关系。

我正在尝试使用以下逻辑,但它无法提供准确的数据

if (condition):
    if b not in top_ten:
        top_ten.append(b)   
        top_ten.remove(tmp)

也欢迎任何其他解决方案。

编辑1

for a in sc_percentage:
            print a

列表我正在

(<ServiceCenter: DELHI-DLC>, 100.0)
(<ServiceCenter: DELHI-DLE>, 75.0)
(<ServiceCenter: DELHI-DLN>, 90.909090909090907)
(<ServiceCenter: DELHI-DLS>, 83.333333333333343)
(<ServiceCenter: DELHI-DLW>, 92.307692307692307)

4 个答案:

答案 0 :(得分:5)

如果列表相当短,那么就像其他人建议的那样,您可以对其进行排序并对其进行切片。如果列表非常大,那么您最好使用heapq.nlargest()

>>> import heapq
>>> lis = [['Mumbai', 98.3], ['London', 23.23], ['Agra', 12.22]]
>>> heapq.nlargest(2, lis, key=lambda x:x[1])
[['Mumbai', 98.3], ['London', 23.23]]

不同之处在于,nlargest只会在列表中进行一次传递,事实上,如果您正在从文件或其他生成的源读取,则不需要同时在内存中。

您可能也有兴趣查看nlargest()的源代码,因为它的工作方式与您尝试解决问题的方式非常相似:它只保留数据结构中所需的元素数量一个堆,每个新值被推入堆中,然后从堆中弹出最小的值。

编辑以显示比较时间

>>> import random
>>> records = []
>>> for i in range(100000):
    value = random.random() * 100
    records.append(('city {:2.4f}'.format(value), value))


>>> import heapq
>>> heapq.nlargest(10, records, key=lambda x:x[1])
[('city 99.9995', 99.99948904248298), ('city 99.9974', 99.99738898315216), ('city 99.9964', 99.99642759230214), ('city 99.9935', 99.99345173704319), ('city 99.9916', 99.99162694442714), ('city 99.9908', 99.99075084123544), ('city 99.9887', 99.98865134685201), ('city 99.9879', 99.98792632193258), ('city 99.9872', 99.98724339718686), ('city 99.9854', 99.98540548350132)]
>>> timeit.timeit('sorted(records, key=lambda x:x[1])[:10]', setup='from __main__ import records', number=10)
1.388942152229788
>>> timeit.timeit('heapq.nlargest(10, records, key=lambda x:x[1])', setup='import heapq;from __main__ import records', number=10)
0.5476185073315492

在我的系统中,通过排序和切片获得100条记录中的前10名是最快的,但是使用1,000条或更多条记录时,使用nlargest的速度会更快。

答案 1 :(得分:3)

首先对列表进行排序,然后对其进行切片:

>>> lis = [['Mumbai', 98.3], ['London', 23.23], ['Agra', 12.22]]
>>> print sorted(lis, key = lambda x : x[1], reverse = True)[:10] #[:10] returns first ten items
[['Mumbai', 98.3], ['London', 23.23], ['Agra', 12.22]]

要从该文件获取列表表单中的数据,请使用以下命令:

with open('abc') as f:
    next(f)  #skip header 
    lis = [[city,float(val)]  for city, val in( line.split() for line in f)]
    print lis 
    #[['Mumbai', 98.3], ['London', 23.23], ['Agra', 12.22]]  

<强>更新

new_lis = sorted(sc_percentage, key = lambda x : x[1], reverse = True)[:10]
for item in new_lis:
   print item

sorted返回一个新的排序列表,因为我们需要根据每个元素的第二项对列表进行排序,因此我们使用了key参数。

key = lambda x : x[1]表示使用每个项目的索引1(即100.0,75.0等)上的值进行比较。

reverse= True用于反向排序。

答案 2 :(得分:2)

您必须将输入转换为Python可以轻松处理的内容:

with open('input.txt') as inputFile:
    lines = inputFile.readLines()
records = [ line.split() for line in lines ]
records = [ float(percentage), city for city, percentage in records ]

现在records包含这样的条目列表:

[ [ 98.3, 'Mumbai' ], [ 23.23, 'London' ], [ 12.22, Agra ] ]

您可以就地排序该列表:

records.sort()

您可以通过切片打印前十名:

print records[0:10]

如果你有一个巨大的列表(例如数百万条目),并且只想以排序的方式排列前十名,那么有比排序整个列表更好的方法(这将浪费时间)。

答案 3 :(得分:1)

要打印您可以使用的前10个城市:

首先对列表进行排序,然后对其进行切片:

>>> lis = [['Mumbai', 98.3], ['London', 23.23], ['Agra', 12.22]]
>>> [k[0] for k in sorted(lis, key = lambda x : x[1], reverse = True)[:10]]
    ['Mumbai', 'London', 'Agra']

对于给定的列表

 >>>: lis=[("<ServiceCenter: DELHI-DLC>", 100.0),("<ServiceCenter: DELHI-DLW>", 92.307692307692307),("<ServiceCenter: DELHI-DLE>", 75.0),("<ServiceCenter: DELHI-DLN>", 90.909090909090907),("<ServiceCenter: DELHI-DLS>", 83.333333333333343)]

 >>>:t=[k[0] for k in sorted(lis, key = lambda x : x[1], reverse = True)[:10]]
 >>>:print t
['<ServiceCenter: DELHI-DLC>',
'<ServiceCenter: DELHI-DLW>',
'<ServiceCenter: DELHI-DLN>',
'<ServiceCenter: DELHI-DLS>',
'<ServiceCenter: DELHI-DLE>']

Sorted函数返回带有键的排序列表作为比较功能。