我有一个非常长的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
的内容,将其应用于项目索引但重新安排整个子列表?
答案 0 :(得分:0)
我无法理解代码,因为所有地方引用的d[...]
都没有在你所展示的地方定义。
在任何情况下,您似乎都在编写冒泡排序,这对于“非常长的列表”来说是一个非常糟糕的想法 - 它是已知效率最低的排序方法之一。将内置sort()
与lambda
或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元组列表来“装饰”你的原始列表,其中每个元组的第一个元素是排序键,第二个元素是原始列表的项目。然后一个简单的排序。然后撕下装饰。最终的msl[:]
也将原始列表的整个内容替换为已排序的列表。
序列:
>>> msl = [(x[1], x) for x in msl]
>>> msl.sort()
>>> msl = [x[1] for x in msl]
是另一种方法,但是通过创建一个新的列表对象(列表对象msl
绑定到更改 - 它不会使用msl[:] = ...
拼写更改。