Как удалить списки, содержащие повторяющиеся значения, из списка списков: - PullRequest
0 голосов
/ 29 марта 2019

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

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

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

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

Ответы [ 3 ]

1 голос
/ 29 марта 2019

Один из методов состоит в том, чтобы отсортировать его и добавить, если его нет в окончательном списке, как упомянуто 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]]
1 голос
/ 29 марта 2019

Основываясь на комментариях, вы не хотите использовать 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]]
0 голосов
/ 29 марта 2019

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

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]]

Удачи.

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