Python使用sort with函数给出TypeError:date\u compare()缺少1个必需的位置参数:error

Python使用sort with函数给出TypeError:date\u compare()缺少1个必需的位置参数:error,python,sorting,amazon-web-services,amazon-ec2,snapshot,Python,Sorting,Amazon Web Services,Amazon Ec2,Snapshot,我对Python完全陌生,请原谅我的知识不足。我正在编写一个脚本来创建AWS EC2快照,然后删除脚本中指定的所有旧快照。我从其他脚本中获取了一些代码,这些脚本似乎是用较旧的Python版本编写的(我使用的是3.3.2) 我很确定我做了一些非常基本的错误,但我真的非常感谢一些帮助,使这项工作。谢谢 您的函数date\u compare接受两个参数,def date\u compare(snap1,snap2)——但是排序函数将只向提供给键的函数传递一个参数,而不是两个项。键关键字用于告诉排序对象

我对Python完全陌生,请原谅我的知识不足。我正在编写一个脚本来创建AWS EC2快照,然后删除脚本中指定的所有旧快照。我从其他脚本中获取了一些代码,这些脚本似乎是用较旧的Python版本编写的(我使用的是3.3.2)


我很确定我做了一些非常基本的错误,但我真的非常感谢一些帮助,使这项工作。谢谢

您的函数
date\u compare
接受两个参数,
def date\u compare(snap1,snap2)
——但是排序函数将只向提供给
键的函数传递一个参数,而不是两个项。
关键字用于告诉排序对象中要比较的字段;它不用于实际比较两个不同的对象。您希望使用
cmp
关键字传递自定义比较函数。很确定您只是想使用
cmp
关键字,而不是

有关更多信息,请参见此:

  • 蟒蛇2:
  • 蟒蛇3:
<>为了理解<代码>键< /C>函数应该如何工作,让我们举一个简单的例子来看看它是如何工作的。假设我有一个元组列表:

>>> my_data = [(0, 'Z',), (1, 'Y',), (2, 'W')]
如果我只是对这些数据进行排序,我会得到:

>>> sorted(my_data)
[(0, 'Z'), (1, 'Y'), (2, 'W')]
但是,如果我想对元组的第二项进行排序,我可以编写如下简单函数:

>>> def get_second(item):
...    return item[1]
>>>
>>> sorted(my_data, key=get_second)
[(2, 'W'), (1, 'Y'), (0, 'Z')]
>>> def compare(left, right):
...     if left[1] < right[1]:
...         return -1
...     elif left[1] == right[1]:
...         return 0
...     else:
...         return 1
>>> sorted(my_data, cmp=compare) 
[(2, 'W'), (1, 'Y'), (0, 'Z')]
现在是第二项的排序。注意,通常使用一个简单的lambda函数来完成以下任务:

>>> sorted(my_data, key=lambda item: item[1])
[(2, 'W'), (1, 'Y'), (0, 'Z')]
这就省去了你必须先定义这样一个简单的函数

要使用
cmp
关键字完成相同的排序,其工作原理如下:

>>> def get_second(item):
...    return item[1]
>>>
>>> sorted(my_data, key=get_second)
[(2, 'W'), (1, 'Y'), (0, 'Z')]
>>> def compare(left, right):
...     if left[1] < right[1]:
...         return -1
...     elif left[1] == right[1]:
...         return 0
...     else:
...         return 1
>>> sorted(my_data, cmp=compare) 
[(2, 'W'), (1, 'Y'), (0, 'Z')]
>>def比较(左、右):
...     如果左[1]<右[1]:
...         返回-1
...     elif left[1]==right[1]:
...         返回0
...     其他:
...         返回1
>>>已排序(my_数据,cmp=比较)
[(2,'W'),(1,'Y'),(0,'Z')]

最后,请注意,
sorted(seq)
seq.sort()
--采用相同的args、kwargs等。just
sorted
是一个副本,而
seq.sort()
是一个就地破坏性操作

您的函数
date\u compare
接受两个参数,
def date\u compare(snap1,snap2)
——但是排序函数将只向提供给
键的函数传递一个参数,而不是两个项。
关键字用于告诉排序对象中要比较的字段;它不用于实际比较两个不同的对象。您希望使用
cmp
关键字传递自定义比较函数。很确定您只是想使用
cmp
关键字,而不是

有关更多信息,请参见此:

  • 蟒蛇2:
  • 蟒蛇3:
<>为了理解<代码>键< /C>函数应该如何工作,让我们举一个简单的例子来看看它是如何工作的。假设我有一个元组列表:

>>> my_data = [(0, 'Z',), (1, 'Y',), (2, 'W')]
如果我只是对这些数据进行排序,我会得到:

>>> sorted(my_data)
[(0, 'Z'), (1, 'Y'), (2, 'W')]
但是,如果我想对元组的第二项进行排序,我可以编写如下简单函数:

>>> def get_second(item):
...    return item[1]
>>>
>>> sorted(my_data, key=get_second)
[(2, 'W'), (1, 'Y'), (0, 'Z')]
>>> def compare(left, right):
...     if left[1] < right[1]:
...         return -1
...     elif left[1] == right[1]:
...         return 0
...     else:
...         return 1
>>> sorted(my_data, cmp=compare) 
[(2, 'W'), (1, 'Y'), (0, 'Z')]
现在是第二项的排序。注意,通常使用一个简单的lambda函数来完成以下任务:

>>> sorted(my_data, key=lambda item: item[1])
[(2, 'W'), (1, 'Y'), (0, 'Z')]
这就省去了你必须先定义这样一个简单的函数

要使用
cmp
关键字完成相同的排序,其工作原理如下:

>>> def get_second(item):
...    return item[1]
>>>
>>> sorted(my_data, key=get_second)
[(2, 'W'), (1, 'Y'), (0, 'Z')]
>>> def compare(left, right):
...     if left[1] < right[1]:
...         return -1
...     elif left[1] == right[1]:
...         return 0
...     else:
...         return 1
>>> sorted(my_data, cmp=compare) 
[(2, 'W'), (1, 'Y'), (0, 'Z')]
>>def比较(左、右):
...     如果左[1]<右[1]:
...         返回-1
...     elif left[1]==right[1]:
...         返回0
...     其他:
...         返回1
>>>已排序(my_数据,cmp=比较)
[(2,'W'),(1,'Y'),(0,'Z')]

最后,请注意,
sorted(seq)
seq.sort()
--采用相同的args、kwargs等。just
sorted
是一个副本,而
seq.sort()
是一个就地破坏性操作

谢谢,我实际上是通过使用一个函数将cmp转换为键来解决这个问题的:从functools导入cmp_到_键快照。排序(key=cmp_到_键(date_compare))这是可行的,但基于您上面提到的内容,我可以用cmp=替换key=,这将获得相同的结果??我认为将
key
更改为
cmp
更标准、更直接。你能投票并接受我的答案吗?没问题,答案被接受,只是刚刚创建了我的帐户,所以我的代表还不允许我投票。谢谢谢谢,我实际上是通过使用一个函数将cmp转换为键来解决这个问题的:从functools导入cmp_到_键快照。排序(key=cmp_到_键(date_compare))这是可行的,但基于您上面提到的内容,我可以用cmp=替换key=,这将获得相同的结果??我认为将
key
更改为
cmp
更标准、更直接。你能投票并接受我的答案吗?没问题,答案被接受,只是刚刚创建了我的帐户,所以我的代表还不允许我投票。谢谢