我有很多非常小的列表,我需要尽快排序。通常这些列表中有2-3个值,内置排序方法似乎有太多的开销。在这种情况下,一个简单的冒泡排序会好吗?
示例,想要排序:
[1, 5]
[4, 2]
[3, 7]
...
要:
[1, 5]
[2, 4]
[3, 7]
...
现在我正在做这样的事情:
def do_something( ilist ):
ilist = sorted(ilist, reverse = True);
return ilist;
for i in range(1000000000):
do_something( [random_num,random_num ] );
感谢。
答案 0 :(得分:2)
是。
如果列表列表总是2个元素。使用>
运算符比使用sorted
更快。
[(i[1], i[0]) if i[0]>i[1] else i for i in lst]
时间:
lst = [(0, 9),
(1, 8),
(2, 7),
(3, 6),
(4, 5),
(5, 4),
(6, 3),
(7, 2),
(8, 1),
(9, 0)]
%timeit [(i[1], i[0]) if i[0]>i[1] else i for i in lst]
1000000 loops, best of 3: 1.96 us per loop
%timeit [sorted(i) for i in lst]
100000 loops, best of 3: 5.87 us per loop
在您的情况下,您说您的列表有2或3个元素。所以你的排序函数看起来像这样。
def sort_few(lst):
if len(lst)==2:
if lst[0] > lst[1]:
return (lst[1], lst[0])
else:
return lst
else:
if lst[0] > lst[1]:
if lst[1] > lst[2]:
return (lst[2], lst[1], lst[0])
else:
return (lst[1], lst[2], lst[0])
elif lst[1] > lst[2]:
if lst[2] > lst[0]:
return (lst[0], lst[2], lst[1])
else:
return (lst[2], lst[0], lst[1])
elif lst[2] > lst[0]:
if lst[0] > lst[1]:
return (lst[1], lst[0], lst[2])
else:
return lst
时间:
lst = [(1, 2, 3),
(1, 3, 2),
(2, 1, 3),
(2, 3, 1),
(3, 1, 2),
(3, 2, 1),
(1, 2, 3),
(1, 3, 2),
(2, 1, 3),
(2, 3, 1),
(3, 1, 2),
(3, 2, 1)]
%timeit [sort_few(i) for i in lst]
100000 loops, best of 3: 6.3 us per loop
%timeit [sorted(i) for i in lst]
100000 loops, best of 3: 7.32 us per loop
如果列表中有2个或3个元素,使用sort_few
比sorted
更快。
答案 1 :(得分:0)
使用sorted()
非常有效:
>>> list_of_lists = [[1, 5], [4, 2], [3, 7]]
>>> sorted_lol = [sorted(sub_list) for sub_list in list_of_lists]
>>> sorted_lol
[[1, 5], [2, 4], [3, 7]]
答案 2 :(得分:0)
values = [{1, 5},{4, 2},{3, 7}]
print(sorted(values))
结果:
[set([1, 5]), set([2, 4]), set([3, 7])]
答案 3 :(得分:0)
如果它只有两个要素:
f = lambda x: x if x[0] < x[1] else [x[1],x[0]]
然后
x = [5,4]
f(x)
这将返回&#39; [4,5]&#39;
x = [4,5]
f(x)
还返回[4,5]
如果它不止两个,这不起作用,虽然你可以使用特殊情况3.这只是进行比较和交换,而不是调用完整的排序函数。