Как мне удалить списки, содержащие повторяющиеся значения, из списка списков:

#python #python-3.x #list

#python #python-3.x #Список

Вопрос:

Мне нужно удалить «дубликаты» из этого списка:

 [[4, 1], [1, 4], [0, 5], [5, 0]]
  

Например: [4, 1] [1, 4] являются одним и тем же объектом, и мне нужно удалить один из них.

Как мне это сделать без использования инструментов понимания списка?

Комментарии:

1. У вас всегда есть 2 элемента в подсписке?

2. Почему «без использования инструментов понимания списка»?

3. какой из них сохранить в случае дублирования.?

4. @AkshayNevrekar. Да, всегда.

5. @SreeramTP не имеет значения.

Ответ №1:

Один из методов — отсортировать его и добавить, если его нет в окончательном списке, как указано LogicalBranch в ответах.

Вы упомянули, что не можете использовать sort и всегда есть 2 элементы в списке. Затем вы можете выполнить простой трюк, создав другой список, обратный списку, и сравнив его в окончательном ответе. Смотрите коды ниже

 ans = []
l = [[4, 1], [1, 4], [0, 5], [5, 0]]
for x in l:
    a = x[::-1]
    if x not in ans and a not in ans:
        ans.append(x)

print(ans) # [[4, 1], [0, 5]]
  

Ответ №2:

Судя по комментариям, вы не хотите использовать list comprehension , sort и у вас всегда есть 2 элемента в подсписке, тогда следующий подход поможет,

Он выполняет итерацию по списку и переворачивает подсписок и проверяет, присутствуют ли они в new_list

 x = [[4, 1], [1, 4], [0, 5], [5, 0]]

new_list = []
for i in x:
    if i[::-1] not in new_list and i not in new_list:
        new_list.append(i)

print(new_list)
  

Вывод:

 [[4, 1], [0, 5]]
  

Ответ №3:

Самый простой способ добиться этого (без импорта чего-либо) — отсортировать каждую пару в списке, прежде чем добавлять ее в новый список результатов, вот так:

 result = []
for pair in [[4, 1], [1, 4], [0, 5], [5, 0]]:
  pair.sort()
  if pair not in result:
    result.append(pair)
print(result)
  

Вы могли бы даже преобразовать это в функцию:

 def list_filter(collection):
  result = []
  for pair in collection:
    pair.sort()
    if pair not in result:
      result.append(pair)
  return result
  

Который вы затем использовали бы следующим образом:

 list_filter([[4, 1], [1, 4], [0, 5], [5, 0]])
  

Который должен возвращать список, который выглядит следующим образом:

 [[1, 4], [0, 5]]
  


Вы могли бы сделать это еще меньше, используя:

 list_filter = lambda collection: list(set([sorted(x) for x in collection]))
  

Который должен возвращать тот же результат.

РЕДАКТИРОВАТЬ: обновленный метод без сортировки:

 (result, collection) = ([], [[4, 1], [1, 4], [0, 5], [5, 0]])

def check(n1, n2):
  for pair in collection:
    if n1 in pair and n2 in pair and sorted(pair) in collection:
      return True
  return False

for pair in collection:
  pair.sort()
  if pair not in result:
    result.append(pair)

print(result)
  

Вы могли бы даже преобразовать это в функцию:

 def new_filter_function(collection):
  result = []

  def check(n1, n2):
    for pair in collection:
      if n1 in pair and n2 in pair and ([n1, n2] in collection or [n2, n1] in collection):
        return True
    return False

  for pair in collection:
    if pair not in result:
      result.append(pair)

  return result
  

Который вы затем использовали бы следующим образом:

 new_filter_function([[4, 1], [1, 4], [0, 5], [5, 0]])
  

Который также должен возвращать список, который выглядит следующим образом:

 [[1, 4], [0, 5]]
  

Удачи.

Комментарии:

1. Мне не разрешено использовать сортировку

2. Можете ли вы использовать dict или collections.?

3. @SreeramTP Нет, я могу использовать другой список и каким-то образом добавить туда новые «уникальные» подсписки