Python 如何在不使用.remove的情况下从列表中删除元素
我正在尝试创建一个函数,用于查找列表的最小值并将其删除,但不使用.remove或min。我有查找最小值的代码:Python 如何在不使用.remove的情况下从列表中删除元素,python,Python,我正在尝试创建一个函数,用于查找列表的最小值并将其删除,但不使用.remove或min。我有查找最小值的代码: userlist = [1,2,3,4,5] smallest = userlist[0] def removeMin(): for i in range(1, len(userlist)): if userlist[i] < smallest: smallest = userlist[i] userlist=[1,2,3,4,5] 最小值=用户列表
userlist = [1,2,3,4,5]
smallest = userlist[0]
def removeMin():
for i in range(1, len(userlist)):
if userlist[i] < smallest:
smallest = userlist[i]
userlist=[1,2,3,4,5]
最小值=用户列表[0]
def removeMin():
对于范围(1,len(userlist))中的i:
如果用户列表[i]<最小值:
最小=用户列表[i]
我尝试过使用.pop,但显然这不起作用,因为最小值是一个变量,而不是一个位置。任何帮助都将不胜感激。这里有一个简单的方法:
#!/usr/bin/python
userlist = [10,2,30,4,5]
def rm_min(lis):
minn = None
ind = None
for i, j in enumerate(lis):
if minn and j < minn:
minn = j
ind = i
elif not minn:
minn = j
else:
pass
return [ y for x,y in enumerate(userlist) if x != ind]
print rm_min(userlist)
#/usr/bin/python
用户列表=[10,2,30,4,5]
def rm_最小值(lis):
minn=无
ind=无
对于枚举(lis)中的i,j:
如果minn和j
输出:
[10,30,4,5]如果要迭代python对象,有比使用range更好的迭代方法。任何iterable都可以像这样循环:
for x in my_list:
pass # do something
以上内容将逐步介绍将当前迭代设置为x
的每个元素。但是,如果还需要索引,请使用Python内置函数,它不仅提供项,还提供当前索引,如下所示:
for index, item in enumerate(my_list):
pass # do something
userlist.pop(userlist.index(-max([-u for u in userlist])))
因此,对于您的功能,您需要如下内容:
def removeMin(my_list):
smallestIndex = 0
smallest = my_list[0]
for i,val in enumerate(my_list):
if val < smallest:
smallest = val
smallestIndex = i
my_list.pop(smallestIndex)
return my_list
这:
- 创建一个列表理解,它反转列表:
[-u代表用户列表中的u]
- 查找该列表的
imum(正常列表的最小值)max
max(…)
- 在原始列表中查找第一个元素的索引,其值为最大值的负数
userlist.index(-)
- 最后弹出该元素
userlist.pop(…)
瞧,不是一个
。移除或一个min
好吧,如果你的主要任务只是找出并删除某个列表中最小的项目,我的意思是不关心这些元素的顺序。也许你可以试试python的heapq
模块
它提供了一个将列表转换为堆的实现,就地。然后,您可以以简单有效的方式删除堆中最小的元素:
以下是一个示例:
import heapq
#alist could be a disordered list, it doesn't matter
alist = [10, 2, 4, 5, 8, 50]
heapq.heapify(alist) #transform alist to heap, in-place. That means None is returned
smallest = heapq.heappop(alist) #pop the smallest element of alist, here is 2
print smallest #output: 2
您可以继续,使用heapq.heapop(alist)
,查找并删除剩余alist
的第二个小元素(第三个小元素,第四个小元素,…),直到索引器
升起(alist中没有任何内容):
如果继续<代码>索引器
引发:
In [7]: heapq.heappop(alist)
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
/home/chiyu/<ipython-input-7-8faac314c419> in <module>()
----> 1 heapq.heappop(alist)
IndexError: index out of range
In [8]:
产出将是:
2
4
5
8
10
50
有一件事值得再次提及:
- 如果您真正关心给定列表中元素的顺序,
heapq不合适。
因为当您调用heapq.heapify(alist)
时,这些元素的顺序已更改:
In [8]: alist = [10, 2, 4, 5, 8, 50]
In [9]: heapq.heapify(alist)
In [10]: alist
Out[10]: [2, 5, 4, 10, 8, 50]
这是一种简单的方法,没有任何复杂的循环和函数
arr=[1,20,5,78,30]
count=0
element=int(input("enter the element you want to remove:"))
for i in range(len(arr)):
if(arr[i]==element):
count=count+1
if(count>=1):
pos=arr.index(element)
arr1 = arr[:pos]+arr[pos+1:]
print(arr1)
else:
print("element not found in array")
这是拼图吗?是否有任何不使用的原因。是否删除?或者您正在尝试实现优先级队列?找到最小值的位置,然后将其弹出,因为pop需要一个参数来决定要弹出哪个。@RayToal如果是拼图,正确的答案是:userlist.pop(userlist.index(-max([-u代表userlist中的u]))
@legostrmtropr非常好,我特别喜欢模拟min
和max
+理解。不过,我仍然对这个问题感到困惑pop
与remove
非常相似,通过索引和值查找最小值似乎不是什么大事。很高兴知道问题的来源。除非我遗漏了什么,否则你不能用min(userlist)
?@GP89替换max([-u代表userlist中的u])
。@GP89两个要求之一是op不能使用min
。哎呀,哈哈。我想我略读了课文。我错过了最重要的部分。我确实觉得有点奇怪:)
In [8]: alist = [10, 2, 4, 5, 8, 50]
In [9]: heapq.heapify(alist)
In [10]: alist
Out[10]: [2, 5, 4, 10, 8, 50]
arr=[1,20,5,78,30]
count=0
element=int(input("enter the element you want to remove:"))
for i in range(len(arr)):
if(arr[i]==element):
count=count+1
if(count>=1):
pos=arr.index(element)
arr1 = arr[:pos]+arr[pos+1:]
print(arr1)
else:
print("element not found in array")