无法使用 lambda 对具有浮点数的项目列表进行排序。做什么?

Cannot sort list of items with float using lambda. What do?

我有一个包含列表列表的项目列表,例如:


lst=
['0038b49c491bb67c9459318c2afce65f        ', 13653705600.0, 13657075200.0]
['0038bad168c0358a65f56ce04ebb0bfa        ', 13724726400.0, 13728441600.0]
['0038e2c5f01fedfa0b4025699374c2a4        ', 13709952000.0, 13723948800.0]
['0038e75eee2104045dfe323a3097e7af        ', 13468204800.0, 13471142400.0]
['0038eb7855072fd017250641fe8ab98b        ', 13700448000.0, 13700448000.0]
['0038eb982de28f0372dbb5c9a76b8db0        ', 13526784000.0, 13526784000.0]
['0038edbe1afe7308d21eb3657952b6e7        ', 13475548800.0, 13476758400.0]

我正在尝试创建此列表的副本,它按第一项排序,然后是第二项。

我一直在研究并尝试过: lst2=排序(lst,key=lambda x:x[1])

我得到这个错误:

TypeError: 'float' object is not subscriptable

我也试过 itemgetter,它得到了同样的错误。

这是代码 - 它旨在成为一个 SPSS 函数,它根据日期的层次结构创建一个变量。

def rcnv():
    
        index=spssaux.VariableDict().VariableIndex
        v_idx=[index(v) for v in varlist]
        
        vals = [None] * len(v_idx)
        row_to_all=[]
        for i,v in enumerate(v_idx):
            row_to_all.append(i)
        
        cur=spss.Cursor(var=v_idx, accessType='w')
        #cvtDates="ALL"
        for i in range(cur.GetCaseCount()):
            row=cur.fetchone()
            for i,v in enumerate(row):
                j=row_to_all[i]
                vals[j]=v
            
              
            (CaseID, Dispo,Prosecuted, Cnvctd, Violent, Dt1, Dt2, Dt3, Dt4) = vals
    
            lst=[]
            lst.append(CaseID)

            
            if Prosecuted== 1 and CaseDisposition== 2:  
                repeat(lst, Dt1, Dt2, Dt3,Dt)
            elif Prosecuted== 1:  
                repeat(lst, Dt1, Dt2, Dt3,Dt4)
            elif Prosecuted== 0:  
                repeat(lst, Dt1, Dt2, Dt3,Dt4)
            else:  
                repeat(lst, Dt1, Dt2, Dt3,Dt4)
                  
            print(lst)
            lst2=sorted(lst, key=lambda x: x[1])
            
                          
rcnv()

你实际上可以只使用这个:

my_list = sorted(lst)

Sorted 将使用顺序进行排序(它将首先尝试对每个列表的第 1 项进行排序,然后对第 2 项进行排序)。

一个工作示例:

lst =[["a", 2], ["a", 1], ["c", 1], ["b",2]]
# expect this to be sorted in (index) order 1,0,3,2
print(sorted(lst))
# > [['a', 1], ['a', 2], ['b', 2], ['c', 1]]
#        1         0         3         2

如果您修复输入“列表”,使其成为有效的 Python 结构,那么您可以使用这种通用方法对任意数量的维度进行排序:

lst= [
['0038b49c491bb67c9459318c2afce65f        ', 13653705600.0, 13657075200.0],
['0038bad168c0358a65f56ce04ebb0bfa        ', 13724726400.0, 13728441600.0],
['0038e2c5f01fedfa0b4025699374c2a4        ', 13709952000.0, 13723948800.0],
['0038e75eee2104045dfe323a3097e7af        ', 33.0, 13471142400.0],
['0038e75eee2104045dfe323a3097e7af        ', 66.0, 13471142400.0],
['0038e75eee2104045dfe323a3097e7af        ', 55.0, 13471142400.0],
['0038eb7855072fd017250641fe8ab98b        ', 13700448000.0, 13700448000.0],
['0038eb982de28f0372dbb5c9a76b8db0        ', 13526784000.0, 13526784000.0],
['0038edbe1afe7308d21eb3657952b6e7        ', 13475548800.0, 13476758400.0]]

lst2=sorted(sorted(lst, key=lambda x: x[1]), key=lambda x: x[0])

print(lst2)

结果:

[['0038b49c491bb67c9459318c2afce65f ', 13653705600.0, 13657075200.0], ['0038bad168c0358a65f56ce04ebb0bfa ', 13724726400.0, 13728441600.0], ['0038e2c5f01fedfa0b4025699374c2a4 ', 13709952000.0, 13723948800.0], ['0038e75eee2104045dfe323a3097e7af
', 33.0, 13471142400.0], ['0038e75eee2104045dfe323a3097e7af ', 55.0, 13471142400.0], ['0038e75eee2104045dfe323a3097e7af ', 66.0, 13471142400.0], ['0038eb7855072fd017250641fe8ab98b ', 13700448000.0, 13700448000.0], ['0038eb982de28f0372dbb5c9a76b8db0 ', 13526784000.0, 13526784000.0], ['0038edbe1afe7308d21eb3657952b6e7
', 13475548800.0, 13476758400.0]]

所以您拨打 sorted 的电话是正确的。没什么问题……只是还不够深入。 这首先在第二列上排序,然后在第一列上再次排序。这为您提供了所需的两级排序,因为 sorted 保证执行“稳定排序”,这意味着任何具有相同键的项目都将在结果列表中保留其相对顺序。

如果您想按其他顺序对列进行排序,上述方法会起作用...您只需交换索引 01。事实证明,因为您想按照每个字段在输入列表项中出现的顺序搜索每个字段,您可以这样做:

lst2=sorted(lst)

并得到相同的结果。请记住,这只有在列的顺序恰好可以满足您的需求时才有效。

您的 lst 定义不正确。您缺少 []

要解决您的排序问题,请参阅下文....

您似乎想要对列表中的列进行排序。

您不需要提供键,因为排序使用默认的逐列排序。

但是,如果您确实想指定仅按第 2 和第 3 列排序的选项,您可以指定 x[1:] 以在 3 列列表中选择第 2 和第 3 列。

下面是两者的示例:

lst = [['m',7,13.5],['k',9,10.25],['d',12,11.5],
       ['k',8,11.5],['d',8,12.5],['m',8,10.5],
       ['m',7,12.5],['k',9,8.5],['d',8,10.5]]

for a in lst:print (a)

lst1 = sorted(lst)
print (lst1)

之前:

['m', 7, 13.5]
['k', 9, 10.25]
['d', 12, 11.5]
['k', 8, 11.5]
['d', 8, 12.5]
['m', 8, 10.5]
['m', 7, 12.5]
['k', 9, 8.5]
['d', 8, 10.5]

排序后:

['d', 8, 10.5]
['d', 8, 12.5]
['d', 12, 11.5]
['k', 8, 11.5]
['k', 9, 8.5]
['k', 9, 10.25]
['m', 7, 12.5]
['m', 7, 13.5]
['m', 8, 10.5]

如果您希望它按第 2 列和第 3 列排序,那么这里是代码和结果。

lst1 = sorted(lst,key=lambda x: x[1:])

排序前:

['m', 7, 13.5]
['k', 9, 10.25]
['d', 12, 11.5]
['k', 8, 11.5]
['d', 8, 12.5]
['m', 8, 10.5]
['m', 7, 12.5]
['k', 9, 8.5]
['d', 8, 10.5]

排序后:

['m', 7, 12.5]
['m', 7, 13.5]
['m', 8, 10.5]
['d', 8, 10.5]
['k', 8, 11.5]
['d', 8, 12.5]
['k', 9, 8.5]
['k', 9, 10.25]
['d', 12, 11.5]