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

问题描述

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


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=sorted(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,Dt)
            elif Prosecuted== 1:  
                repeat(lst,Dt4)
            elif Prosecuted== 0:  
                repeat(lst,Dt4)
            else:  
                repeat(lst,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",["b",2]]
# expect this to be sorted in (index) order 1,3,2
print(sorted(lst))
# > [['a',['a',['b',['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],66.0,55.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',13657075200.0],[ '0038bad168c0358a65f56ce04ebb0bfa',13724726400.0,13728441600.0],[ '0038e2c5f01fedfa0b4025699374c2a4',13709952000.0,13723948800.0],['0038e75eee2104045dfe323a3097e7af
',['0038e75eee2104045dfe323a3097e7af',55.0,13471142400.0],[ '0038e75eee2104045dfe323a3097e7af',66.0,13471142400.0],[ '0038eb7855072fd017250641fe8ab98b',13700448000.0,13700448000.0],[ '0038eb982de28f0372dbb5c9a76b8db0',13526784000.0,13526784000.0],['0038edbe1afe7308d21eb3657952b6e7
',13476758400.0]]

因此,您对 sorted 的调用是正确的。它没有任何问题……只是做得还不够。 这首先对第二列进行排序,然后再次对第一列进行排序。这为您提供了您想要的两级排序,因为 sorted 保证执行“稳定排序”,这意味着出于排序目的具有相同键的任何项目在结果列表中保留其相对顺序。

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

lst2=sorted(lst)

并获得相同的结果。请记住,这仅在列碰巧按正确顺序为您提供所需内容时才有效。

,

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

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

看起来您要排序以对列表中的列进行一一排序。

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

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

以下是两者的示例:

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

for a in lst:print (a)

lst1 = sorted(lst)
print (lst1)

之前:

['m',13.5]
['k',10.25]
['d',11.5]
['k',11.5]
['d',12.5]
['m',10.5]
['m',12.5]
['k',8.5]
['d',10.5]

排序后:

['d',10.5]
['d',12.5]
['d',8.5]
['k',10.25]
['m',13.5]
['m',10.5]

如果您要查找按第 2 列和第 3 列排序,那么这里是代码和结果。

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

排序前:

['m',10.5]

排序后:

['m',10.5]
['k',11.5]