【问题标题】:Removing the smaller value from a list using function min() [duplicate]使用函数 min() 从列表中删除较小的值
【发布时间】:2021-08-30 17:38:18
【问题描述】:

简而言之,这是计划:我想从 Python 列表中删除最小值。我的方法是创建一个新列表 trimmed ,它基本上是原始列表的副本,但条件如下:

仅当值不等于 min() 时才将其添加到 trimmed。像这样:

lis=[]
trimmed =[]

n = int(input("Enter number of elements : "))
for i in range(0, n):
    elements = int(input("Type a number: "))
    lis.append(elements) # adding the elements

# "trimmed" appends a new copy of "lis" removing the smaller value

trimmed = [x for i,x in enumerate(lis) if i != min(lis)]

print(trimmed)

问题是,它有时似乎是通过删除特定索引中的值而不是删除实际较小的值来构建trimmed。例如。我刚刚输入了 5 ,2 ,6 和 9。它应该 ramv 删除了第二个。相反,它会打印出 [5, 2, 9]

【问题讨论】:

  • 好吧,当然,因为这是你在你的条件下使用的,i from for i,x in enumerate(lis) 是索引。跨度>
  • for i,x in enumerate(lis) 中,i 是元素的索引,而不是值。最小值为 2,因此无论其值如何,您都忽略了索引 2 处的元素。
  • 顺便说一句,将min(lis) 移出循环。通过将min(lis) 放入列表理解条件中,您已经创建了一个线性时间算法二次时间

标签: python min


【解决方案1】:

这是因为您的 if i != min(lis) 根据 index 变量 i 而不是值本身 x 检查最小值。 enumerate 回馈(index, val) 对,即(i, x) 这里。碰巧min(lis) 是 2,所以每当i 达到 2 时,该值将被修剪,因此您看到 6 消失(位于第二个索引处)。修复是与x进行比较:

trimmed = [x for i,x in enumerate(lis) if x != min(lis)]

应该这样做。

但更好的是,让我们只计算一次最小值(以上计算多次):

minimum = min(lis)
trimmed = [x for i,x in enumerate(lis) if x != minimum]

此外,您似乎根本不需要i

minimum = min(lis)
trimmed = [x for x in list if x != minimum]

【讨论】:

    【解决方案2】:

    索引与最小值无关。不用一一列举。

    minval = min(lis)
    trimmed = [x for x in lis if x != minval]
    

    【讨论】:

      猜你喜欢
      • 2013-02-15
      • 2020-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      相关资源
      最近更新 更多