我正在尝试根据数字是奇数还是偶数(甚至获得更高优先级)对数字列表进行排序。 示例:
a=[1,2,3,4]
a.sort(key=org(a)) sorted will produce [2,4,1,3]. I want to use the sort method
def org(a):
for i in range(len(a)):
if a[i]%2==0:
b.append(a[i])
b.sort()
else:
c.append(a[i])
c.sort()
print(b+c)
我从运行a.sort(key = org(a))
中得到此错误Traceback (most recent call last):
File "<pyshell#80>", line 1, in <module>
a.sort(key=org(a))
TypeError: 'list' object is not callable
我意识到每次排序都会让它变慢。我可以采用哪种方式而不必在每次循环后进行排序?
答案 0 :(得分:7)
按照&#34;均匀度排序&#34;然后按大小,您可以使用返回tuple
>>> a=[1,2,3,4]
>>> a.sort(key=lambda x: (x % 2, x))
>>> a
[2, 4, 1, 3]
要首先对奇数条目进行排序,您可以简单地否定模数的值。这是一种有用的技巧,可以反转一般的数字字段。
>>> a.sort(key=lambda x:(-(x % 2), x))
>>> a
[1, 3, 2, 4]
答案 1 :(得分:2)
看起来你走在正确的轨道上:
a = [1,2,3,4]
>>> sorted(a,key=lambda x: x%2)
[2, 4, 1, 3]
此处sorted
是一个返回已排序列表的函数。正如约翰所说,你也可以使用sort
方法。显然,如果您的原始列表没有排序,sorted
将无效,那么您必须这样做:
a = [3,2,1,4]
a.sort()
newList = sorted(a,key=lambda x: x%2)
此时John的代码可能更清晰。也可以通过sorted
来实现sorted(a,key=lambda x: (x%2,x))
功能。
答案 2 :(得分:0)
one can use helper function from intertools
def partition_by_pred(pred, iterable):
from itertools import tee, filterfalse
t1, t2 = tee(iterable)
return filterfalse(pred, t1), filter(pred, t2)
l, r = partition_by_pred(lambda x: False if x % 2 == 0 else True ,[1,2,3,4] )
print(*l,*r)
2 4 1 3