我正在获取一个列表,我将按以下方式保存结果
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)
答案 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函数返回带有键的排序列表作为比较功能。