我正在编写一个程序,该程序给出一个整数列表,确定最小值,然后使用列表的次要索引删除最小值。
例如:list = [3、6、15、2、4、2]应返回[3、6、15、4、2] 请注意,由于列表中的次要索引,前2个已删除。
这是我的完整代码:
def remove_smallest(numbers):
mylist = []
if not numbers:
return mylist
minimo = min(numbers)
if numbers.count(minimo) > 1:
numbers = numbers[::-1] #My solution to the minor index is to reverse the list and loop. Then reverse again.
#mylist = [item for item in numbers if item != minimo and item not in mylist] #I tried to use a list comprehension, with awful results.
it = iter(numbers)
for item in it:
if item == minimo and item in mylist:
next(it, None)
continue
mylist.append(item)
print(mylist[::-1])
remove_smallest([2, 4, 5, 1, 2, 1])
前两项将附加到“ mylist”(1、2)。 然后,因为1在mylist上,它将跳过它,然后继续。到目前为止,还不错,但是当它应该选择5时,它不会,而是直接转到4然后是2,导致在程序结尾处看起来像这样的数组:[2,4,2,1 ]应该何时返回[2,4,5,2,1]
谢谢
答案 0 :(得分:2)
删除下一条语句可使代码按预期方式工作。 for循环已经在迭代器上调用了下一个,因此无需手动进行。
def remove_smallest(numbers):
mylist = []
if not numbers:
return mylist
minimo = min(numbers)
if numbers.count(minimo) > 1:
numbers = numbers[::-1] #My solution to the minor index is to reverse the list and loop. Then reverse again.
it = iter(numbers)
for item in it:
if item == minimo and item in mylist:
continue
mylist.append(item)
print(mylist[::-1])
remove_smallest([2, 4, 5, 1, 2, 1])
结果:
[2, 4, 5, 2, 1]
答案 1 :(得分:2)
一个简单的语句将删除最小值。 l.index(min(l))
找到最小值的索引。
>>> l = [2,4,5,1,2,1]
>>> del l[l.index(min(l))]
>>> l
[2, 4, 5, 2, 1]
答案 2 :(得分:1)
我将设计一种新方法,因为我发现您的代码太多:
def remove_smallest(lst):
mini = min(lst)
indx = next((i for i, x in enumerate(lst) if x == mini), -1)
del lst[indx]
return lst
可安全删除列表中最小元素的首次出现。
用法:
>>> remove_smallest([2, 4, 5, 1, 2, 1])
[2, 4, 5, 2, 1]
答案 3 :(得分:1)
此函数将删除列表中第一个出现的最小数字并返回该数字,该列表已就地修改,因此无需返回:
def pop_smallest(lst):
smallest = lst.index(min(lst))
return lst.pop(smallest)
l = [2, 4, 5, 1, 2, 1]
pop_smallest(l)
>>> 1
l
>>> [2, 4, 5, 2, 1]
但是如果您不想修改原始列表,则需要复制列表并返回新列表
def pop_smallest(lst):
new_lst = lst.copy()
smallest = new_lst.index(min(lst))
new_lst.pop(smallest)
return new_lst
l = [2, 4, 5, 1, 2, 1]
new_l = pop_smallest(l)
l
>>> [2, 4, 5, 1, 2, 1]
new_l
>>> [2, 4, 5, 2, 1]