python实现归并排序时报错

Python037

python实现归并排序时报错,第1张

因为merge_sort函数没有返回值,所以l1=merge_sort(left)和r1=merge_sort(right)中出l1和r1没有类型的错误,加一个返回值return li就没问题了.

完整的Python程序如下(改动的地方见注释)

def merge_sort(li):

 if len(li)==1:

  return li  #这里return改成return li

 mid=len(li)//2

 left=li[:mid]

 right=li[mid:]

 l1=merge_sort(left)

 r1=merge_sort(right)

 return merge(l1,r1)

def merge(left,right):

 result=[]

 while len(left)>0 and len(right)>0:

  if left[0]<=right[0]:

   result.append(left.pop(0))

  else:

   result.append(right.pop(0))

 result+=left

 result+=right

 return result

a=[2,39,92,19,28,32,85,53]

print(merge_sort(a))

源代码(注意源代码的缩进)

tag_sorted = sorted(tag_count.iteritems(),key = operator.itemgetter(1),reverse = True)

# tag_sorted是个列表

eg.

>>>adict = dict([(x, 10+x) for x in xrange(10)])

>>>adict

{0: 10, 1: 11, 2: 12, 3: 13, 4: 14, 5: 15, 6: 16, 7: 17, 8: 18, 9: 19}

>>>sorted(adict.iteritems())

[(0, 10), (1, 11), (2, 12), (3, 13), (4, 14), (5, 15), (6, 16), (7, 17), (8, 18), (9, 19)]

>>>

对于列表是没有.iteritems()方法的;后续代码可以调整为:

for i,(k,v) in enumerate(tag_sorted):

print("%d %d %d"%(k,v,i))

numbers.sort这种用法是错误的,如果你想要排序,则用如下语句:

num_sort=sorted(numbers,key=None,reverse=False)

新的list num_sort才是一个排序后的列表。然后,你自定义的cmp过程只能对比两个数字,而能对比列表中的各个元素,python3解释器不知道你要做什么,所以才会出错。