1

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

[[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

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

4

1 回答 1

0

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

无论如何,您似乎正在编写冒泡排序,这对于“非常长的列表”来说是一个非常糟糕的主意——它是已知效率最低的排序方法之一。使用sort()带有lambdaor的内置itemgetter函数(如@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 元组列表来“装饰”您的原始列表,其中每个元组的第一个元素是排序键,第二个元素是原始列表的项目。然后是普通的排序。然后撕掉装饰。finalmsl[:]也将原始列表的全部内容替换为排序列表。

序列:

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

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

于 2013-11-05T22:28:15.873 回答