Удаление вложенного списка путем сравнения его элементов с элементами во всех других вложенных списках в Python

#python #list #element

#python #Список #элемент

Вопрос:

Я сохраняю начальные и конечные координаты отрезков вместе с некоторыми атрибутами в списке списков с формой.

Я хочу удалить из моего основного списка каждый вложенный список, в котором пара координат (x1 y1, x2 y2) уже существует в моем списке, но поменялась местами (x2 y2, x1 y1)

Мой код:

 lines=[[(x1, y1), (x2, y2), id1, id2],[(x2, y2), (x1, y1), id2, id1]] #random example 
lns=[ [l[0], l[1]] for l in lines] #make a list only with the node coordinate pairs
for line in lines:
if [line[1],line[0]] in lns: 
    lines.remove(line) 
  

Результатом этого кода является удаление некоторых элементов, которые я хочу (хотя и не всех), и некоторых, которые не следует удалять. Есть идеи, чего мне может не хватать?

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

1. Вам нужно изменить свое if условие и добавить идентификаторы в конце: if [line[1],line[0],line[2],line[3]] in lns:

2. @VasilisG. С вашим предложенным условием я могу опустить понимание списка, которое создает список «lns», и выполнить итерацию в моем списке «lines». Тем не менее, у меня все еще есть некоторые строки, которых там не должно быть. Чтобы проверить, «проходят» ли они условие, я применил точно такой же код еще раз в результирующем списке и получил правильный результат. Но это не так, как это должно работать. Я все еще не могу представить, что идет не так.

3. Не могли бы вы предоставить некоторые примеры данных и желаемый результат из них?

4. Вы можете найти файлы .txt и .py с моим кодом здесь, по ссылке . В списках два элемента вместо четырех, поэтому используются только идентификаторы точек. Я не включил координаты точек для простоты. Точно такой же процесс может быть применен к идентификаторам точек вместо этого.

5. Я забыл упомянуть о желаемом выходе, идентификаторы в списке представляют идентификаторы начальной и конечной точек строк. Все строки существуют в списке, определенном от начальной до конечной точки и наоборот. Таким образом, вся пара идентификаторов включается дважды. Мне нужно, чтобы в конечном списке была половина его элементов

Ответ №1:

С небольшими изменениями в исходном коде и после исправления ошибки этот код выдает правильный результат:

 lines=[[(x1, y1), (x2, y2), id1, id2],[(x2, y2), (x1, y1), id2, id1]]
for line in lines:
    if [line[1],line[0], line[3],line[2]] in lns: 
         lines.remove([line[1],line[0], line[3],line[2]])