不使用内置函数对字典进行排序

时间:2014-11-23 05:33:48

标签: python dictionary

如果我有字典:

mydict = {'a':1, 'b':4, 'c':9, 'd':3, 'e':1}

如何使用内置方法(如sorted?

)从最大最小的值中按值对字典进行排序

3 个答案:

答案 0 :(得分:0)

这是一个实现quicksort并使用它来对字典值进行排序的程序。这是quicksort的递归,就地实现。

def quicksort(data, left, right):
    if left+1 >= right:
        return
    tail = left
    for i in range(left, right-1):
        if data[i] < data[right-1]:
            data[tail], data[i] = data[i], data[tail]
            tail += 1
    data[right-1], data[tail] = data[tail], data[right-1]
    quicksort(data, left, tail)
    quicksort(data, tail+1, right)

mydict = { 'a': 1, 'b': 4, 'c': 9, 'd': 3, 'e': 1 }
values = [value for key, value in mydict.items()]
quicksort(values, 0, len(values))
print(values)

上面的代码使用范围中的最后一个元素作为数据透视表。如果你想要更好的表现并且你愿意忍受更多的代码,你可以通过取第一个,中间和最后一个值的中位数来选择枢轴元素。

def quicksort(data, left, right):
    if left+1 >= right:
        return
    ai, bi, ci = left, (left+right)//2, right-1
    a, b, c = data[ai], data[bi], data[ci]
    if a < b:
        if c < a:
            pos = ai
        elif c < b:
            pos = ci
        else:
            pos = bi
    else:
        if c < b:
            pos = bi
        elif c < a:
            pos = ci
        else:
            pos = ai
    pivot = data[pos]
    data[pos] = data[right-1]
    tail = left
    for i in range(left, right-1):
        if data[i] < pivot:
            data[tail], data[i] = data[i], data[tail]
            tail += 1
    data[right-1], data[tail] = data[tail], pivot
    quicksort(data, left, tail)
    quicksort(data, tail+1, right)

mydict = { 'a': 1, 'b': 4, 'c': 9, 'd': 3, 'e': 1 }
values = [value for key, value in mydict.items()]
quicksort(values, 0, len(values))
print(values)

答案 1 :(得分:0)

冒泡排序是最容易实现的:

def order(x, y):    
    if x[1] < y[1]:
        return x, y
    else:
        return y, x

def bubble(mydict):
    d_items = mydict.items()
    for j in range(len(d_items) - 1):
        for i in range(len(d_items) - 1):
            d_items[i], d_items[i+1] = order(d_items[i], d_items[i+1])
    return d_items


mydict = {'a':1, 'b':4, 'c':9, 'd':3, 'e':1}
sorted_tuples = bubble(mydict)
print sorted_tuples  # prints [('a', 1), ('e', 1), ('d', 3), ('b', 4), ('c', 9)]

免责声明:由于我现在就此发表了第二条评论,似乎SO成员对冒泡排序有很强烈的感受。我个人没有任何赞成和反对,使用冒泡排序。也就是说,值得一提的是,冒泡排序是一种效率低下的排序算法,其运行时复杂度为O(n^2)

答案 2 :(得分:0)

一个非常简单的快速排序实现:

def quick(lst):
    if len(lst) < 2:
        return lst
    pivot = lst[0]
    l = quick([x for x in lst[1:] if x < pivot])
    u = quick([x for x in lst[1:] if x >= pivot])
    return l + [pivot] + u