按字母顺序排序2d列表

时间:2013-11-05 21:10:11

标签: python

我有一个非常长的2d列表,其中包含以下形式的字符串

[[Month, Item, Price],[Month, Item, Price],.......]]

虚拟短版本2d列表我已按字母顺序排列

msl =[['March', 'cook', '4.53'], ['March', 'book', '3.23'], ['June', 'clothes', '1.52'], ['December', 'clothes', '3.42']]

我要做的是编写没有字典或lambda的代码,按项目按字母顺序对项目进行排序。例如,而不是[['March','cook','4.53'],['March','book','3.23']它变成[['March','book','3.23'],['March','cook','4.53']...]],但我写的代码似乎不起作用,我不知道为什么。我写了以下

if msl[h][0] == msl[h+1][0] : # If month is the same as next month
    print "true"
    size = len( msl )         # start an item dictionary sort(msl[i][1])
    unsorted = True
    while unsorted :
        unsorted = False
        i = 0
        while i < size-1 :
            if msl[i][1] > d[i+1][1] : #if the item is greater than the next
                print "true again"
                temp = d[i]            # temp = current sublist
                d[i] = d[i+1]          # current sublist becomes next sublist
                d[i+1] = temp          # next sublist becomes current sublist
                unsorted = True
                i = i + 1

else :
    h= h+1

我在那里写“trues”来检查程序的进程,并且它打印到所有这些的真实,但是当我尝试打印出新的msl时,没有任何结果。是否可以使用.sort方法编写类似while month remains the same, sort items的内容,将其应用于项目索引但重新安排整个子列表?

1 个答案:

答案 0 :(得分:0)

我无法理解代码,因为所有地方引用的d[...]都没有在你所展示的地方定义。

在任何情况下,您似乎都在编写冒泡排序,这对于“非常长的列表”来说是一个非常糟糕的想法 - 它是已知效率最低的排序方法之一。将内置sort()lambdaitemgetter(建议使用@Arrieta)一起使用是最好的。

但是key=使用sort()参数永远不会必需。它只是理智;-)可以总是使用较旧(且更浪费)的DSU(装饰,排序,不装饰)模式:

>>> decorated = [(x[1], x) for x in msl]
>>> decorated.sort()
>>> msl[:] = [x[1] for x in decorated]
>>> msl
[['March', 'book', '3.23'], ['December', 'clothes', '3.42'],
 ['June', 'clothes', '1.52'], ['March', 'cook', '4.53']]

这可以通过构建一个新的2元组列表来“装饰”你的原始列表,其中每个元组的第一个元素是排序键,第二个元素是原始列表的项目。然后一个简单的排序。然后撕下装饰。最终的msl[:]也将原始列表的整个内容替换为已排序的列表。

序列:

>>> msl = [(x[1], x) for x in msl]
>>> msl.sort()
>>> msl = [x[1] for x in msl]

是另一种方法,但是通过创建一个新的列表对象(列表对象msl绑定到更改 - 它不会使用msl[:] = ...拼写更改。