我正在尝试创建一个将列表缩短到仅4个元素的函数。但是,我无法为函数的参数分配类型,我称之为my_list
。
我尝试使用type()
,但是没有用。
以下是一些代码:
LL = [2,3,4,5,6,2,5,4]
print(len(LL))
def remove_last_elements(the_list):
the_list.type(list) #Here it gives an error message that I will put below
for i in range (len(the_list)-4):
the_list=the_list.remove(the_list[len(the_list)-1])
remove_last_elements(LL)
print(LL)
它给了我这个错误信息。如果我使用.type()
。
remove_last_elements(LL)
File "C:\Users\visha\OneDrive\Desktop\Arnav's Things\Coding\Python Programs (and side-products)\Balloons.py", line 5, in remove_last_elements
the_list.type(list)
AttributeError: 'list' object has no attribute 'type'
这是另一段没有.type()
的代码段:
LL = [2,3,4,5,6,2,5,4]
print(len(LL))
def remove_last_elements(the_list):
for i in range (len(the_list)-4):
the_list=the_list.remove(the_list[len(the_list)-1])
remove_last_elements(LL)
print(LL)
哪个给出以下错误消息:
remove_last_elements(LL)
File "C:\Users\visha\OneDrive\Desktop\Arnav's Things\Coding\Python Programs (and side-products)\Balloons.py", line 5, in remove_last_elements
the_list=the_list.remove(the_list[len(the_list)-1])
AttributeError: 'NoneType' object has no attribute 'remove'
答案 0 :(得分:3)
我不确定通过“将类型分配给列表”来尝试做什么。根据定义,列表属于列表类型,您可以使用type(the_list)
进行验证。不过,我不建议根据此结果做出任何程序化决策。只需假设所有类型都是正确的类型,否则就崩溃。
如果不确定对象上是否存在方法并查看方法是否存在,可以使用dir()
:
>>> dir(list)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__
', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash_
_', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul_
_', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmu
l__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append',
'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'
]
>>> "type" in dir(list)
False
>>>
第二,list.remove()
是一个操作in place并返回值None
的函数。当您分配(基本上)the_list = None
时,在下一次迭代中(基本上)None.remove()
会引发您遇到的第二个异常。
解决这两个错误会产生:
LL = [2,3,4,5,6,2,5,4]
def remove_last_elements(the_list):
for i in range (len(the_list)-4):
the_list.remove(the_list[len(the_list)-1])
remove_last_elements(LL)
print(LL)
现在,此功能甚至必要吗?由于某些原因,我不会争论。
首先,它在不通知调用者的情况下hardcodes值4,使其几乎无用于其他目的。例如,如果要删除5个元素,我很不幸,必须编写一个新函数。我希望缩短长度是此函数的参数,以便我可以选择自行选择的任意n
值的列表缩短。
第二,remove
总是删除列表中第一个出现的项目。结果列表[2, 3, 6, 2]
与服务有关,函数名称暗示“删除最后一个元素”,这令人困惑。作为您函数的用户,当列表中的最后四个元素中的两个仍然存在时,我感到很惊讶!
最后,.remove
是一个非常慢的操作:对于列表中的每个项目,我们都必须走到整个列表才能找到并删除它。这将对大型列表产生严重的性能影响。
我将使用Python的slice
operator来高效,简洁和可预测地执行列表缩短:
>>> LL = [2,3,4,5,6,2,5,4]
>>> LL[:-4] # remove and return up to the last 4
[2, 3, 4, 5]
>>> LL[-4:] # remove and return the last 4
[6, 2, 5, 4]
您可以修改程序以使用它,如下所示:
LL = [2,3,4,5,6,2,5,4]
LL = LL[:-4]
print(LL) # => [2, 3, 4, 5]
答案 1 :(得分:2)
Python是动态类型的。您不能像在C或C ++中那样声明变量的类型。列表是可以具有不同类型的元素的集合。相同的列表可以容纳所有内容:字符串,整数,浮点数,自定义类等。
这:the_list.type(list)
毫无意义。
答案 2 :(得分:1)
LL = [2,3,4,5,6,2,5,4]
print(len(LL))
def remove_last_elements(the_list):
for i in range (len(the_list)-4):
the_list=the_list.remove(the_list[len(the_list)-1])
remove_last_elements(LL)
print(LL)
您正在将the_list
重置为无,因为the_list.remove会执行适当的操作,并且不返回任何值
尝试一下:
LL = [2,3,4,5,6,2,5,4]
print(len(LL))
def remove_last_elements(the_list):
for i in range (len(the_list)-4):
the_list.remove(the_list[len(the_list)-1])
remove_last_elements(LL)
print(LL)
您无法使用.type()
设置Python对象的类型,而只是使用type(x)
来获取对象x
的类型。如果要将某物的类型从一组更改为列表,可以使用list(set('a', 'b'))