Как удалить самые низкие элементы в списке? - PullRequest
0 голосов
/ 22 сентября 2019

Учитывая мой список:

arr=[['Harsh', 20], ['Beria', 20], ['Varun', 19], ['Kakunami', 19], ['Vikas', 21]]

Я должен удалить элементы, содержащие наименьшие числа

т.е. элементы:

['Varun', 19], ['Kakunami', 19]

Я пробовал следующий код:

arr=[['Harsh', 20], ['Beria', 20], ['Varun', 19], ['Kakunami', 19], ['Vikas', 21]]
arr.sort(key=lambda x: (x[1],x[0]))
min_value=min(arr,key=lambda x:x[1])
min_marks=min_value[1]
for i in arr:
    if i[1]==min_marks:
        arr.remove(i)

, но это не дает желаемого результата

Ответы [ 4 ]

0 голосов
/ 22 сентября 2019

Вот простое решение, о котором я мог подумать:

arr=[['Harsh', 20], ['Beria', 20], ['Varun', 19], ['Kakunami', 19], ['Vikas', 21]]

lowest = sorted(set([i[1] for i in arr]))[0]

output = [i for i in arr if i[1] != lowest]

Он просто проверяет наименьшее значение в arr и удаляет список, содержащий наименьшее значение, из окончательного вывода

0 голосов
/ 22 сентября 2019

Проблема: Вы не должны изменять список во время итерации

Резюме: Когда мы удаляем первый элемент, содержащий 19, остальные «скользят вниз».Например, когда мы удалили arr[2] aka ['Varun', 19], ['Kakunami', 19] заменил его.Затем цикл продолжился до arr[3], который теперь равен ['Vikas', 21].Это, в некотором смысле, оставило ['Kakunami', 19] вне цикла.

Решение: Чтобы обойти это, просто зациклите список в обратном порядке: (Приходится использовать while ... Iдумать)

arr=[['Harsh', 20], ['Beria', 20], ['Varun', 19], ['Kakunami', 19], ['Vikas', 21]]

arr.sort(key=lambda x: (x[1],x[0]))
min_value=min(arr,key=lambda x:x[1])
min_marks=min_value[1]

i = len(arr) - 1;
while i >= 0:
  if arr[i][1]==min_marks:
    arr.remove(arr[i])
  i = i - 1

print arr

Repl.it в качестве демо

Вы можете сделать это рекурсивно:

arr=[['Harsh', 20], ['Beria', 20], ['Varun', 19], ['Kakunami', 19], ['Vikas', 21]]

arr.sort(key=lambda x: (x[1],x[0]))
min_value=min(arr,key=lambda x:x[1])
min_marks=min_value[1]

def removeLowest(arr, min):
  for i in arr:
      if i[1]==min_marks:
          arr.remove(i)
          return removeLowest(arr, min)
  return arr

removeLowest(arr, min)

print arr

В противном случае, есть многодругие альтернативы:)

0 голосов
/ 22 сентября 2019

Не внося слишком много изменений в код, этого можно достичь, используя понимание списка .

arr = [['Harsh', 20], ['Beria', 20], ['Varun', 19], ['Kakunami', 19], ['Vikas', 21]]
arr.sort(key=lambda x: (x[1], x[0]))
min_value = min(arr,key=lambda x:x[1])
min_marks = min_value[1]

arr = [ elem for elem in arr if elem[1] != min_marks] 

Не удастся удалить такие элементы из списка во время итерации.над ним.Вместо этого вы можете сформировать список признаков для удаления и использования функции .remove().

0 голосов
/ 22 сентября 2019

Если вы можете создать новый список, то это будет работать:

arr = [['Harsh', 20], ['Beria', 20], ['Varun', 19], ['Kakunami', 19], ['Vikas', 21]]
min_number = min(arr, key=lambda x: x[1])[1]
arr = [pair for pair in arr if pair[1] != min_number]

В противном случае вы можете посмотреть некоторые ответы здесь: Как удалить элементы из списка во время итерации?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...