Удаление дублирования нескольких списков в циклах for - PullRequest
0 голосов
/ 21 мая 2018

У меня есть функция, которая должна проверять дублирование в двух списках одновременно.Один список имеет значения x, а другой - значения y для декартовой системы.Одна координата не может быть повторена.В настоящее время мой код выглядит следующим образом:

    for q in range(0, len(prows)-1, 1):
            for w in range(0, len(prows)-1, 1):
                if prows[q] == prows[w] and pcols[q] == prows[w]:
                    prows.remove(prows[w])
                    pcols.remove(pcols[w])

Где prows - это значения y, а pcols - значения x.Это работает, проблема в том, что мой первый цикл for обновляет только длину prows после того, как второй цикл for прошел через все его значения.Из-за этого я получаю ошибку индексации, первый цикл for по-прежнему имеет исходную длину prows, в то время как второй цикл for имеет более новую длину с удаленным дублированием.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Используя тот факт, что dict s сохраняет порядок вставки своих ключей (который станет частью спецификации в Python 3.7, но уже верен в 3.6), это можно сделать в одну короткую строку:

# create some data       
>>> import random
>>> a = [random.randint(0, 3) for _ in range(20)]
>>> b = [random.randint(0, 3) for _ in range(20)]
>>> 
>>> a
[0, 3, 2, 1, 2, 0, 1, 2, 0, 2, 1, 1, 0, 3, 1, 3, 1, 2, 3, 2]
>>> b
[1, 0, 3, 2, 2, 2, 2, 3, 1, 2, 1, 1, 1, 1, 3, 0, 0, 0, 3, 3]
>>> 
# this one line is all we need
>>> au, bu = zip(*dict.fromkeys(zip(a, b)))
>>> 
# admire
>>> au
(0, 3, 2, 1, 2, 0, 1, 3, 1, 1, 2, 3)
>>> bu
(1, 0, 3, 2, 2, 2, 1, 1, 3, 0, 0, 3)

Обратите внимание, что вопреки тому, что можно ожидать, это не работает с наборами - действительно нужно использовать dict (с фиктивными значениями).

0 голосов
/ 21 мая 2018
xlist = [ 1, 3, 5, 7, 9, 5]
ylist = [11,33,55,77,99,55]   # (5,55) dupe'd

coords = list(zip(xlist,ylist)) # list of unique coords

print(coords) # still has dupes

result = []       # empty result list, no dupes allowed
setCoords = set() # remember which coords we already put into result
for c in coords:  # go through original coords, one at a time
    if c in setCoords:  # we already added this, skip it
        continue
    setCoords.add(c)    # add to set for comparison
    result.append(c)    # add to result

print(result) # no dupes, still in order of list

Вывод:

[(1, 11), (3, 33), (5, 55), (7, 77), (9, 99), (5, 55)] # coords, with dupes
[(1, 11), (3, 33), (5, 55), (7, 77), (9, 99)]          # result, no dupes

Вы также можете вернуться к xlist и ylist, выполнив:

x2 , y2 = [list(tups) for tups in zip(*result)]

print(x2)
print(y2)

Вывод:

[1, 3, 5, 7, 9] 
[11, 33, 55, 77, 99]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...