无法使用 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
保证执行“稳定排序”,这意味着任何具有相同键的项目都将在结果列表中保留其相对顺序。
如果您想按其他顺序对列进行排序,上述方法会起作用...您只需交换索引 0
和 1
。事实证明,因为您想按照每个字段在输入列表项中出现的顺序搜索每个字段,您可以这样做:
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]
我有一个包含列表列表的项目列表,例如:
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
保证执行“稳定排序”,这意味着任何具有相同键的项目都将在结果列表中保留其相对顺序。
如果您想按其他顺序对列进行排序,上述方法会起作用...您只需交换索引 0
和 1
。事实证明,因为您想按照每个字段在输入列表项中出现的顺序搜索每个字段,您可以这样做:
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]