Итерация по кортежам в списке - PullRequest
0 голосов
/ 14 сентября 2018

Допустим, у меня есть список из кортежей:

 stList = [('NJ', 'Burlington County', '12/21/2017'),
 ('NJ', 'Burlington County', '12/21/2017'),
 ('NJ', 'Burlington County', '12/21/2017'),
 ('VA', 'Frederick County', '2/13/2018'),
 ('MD', 'Montgomery County', '8/7/2017'),
 ('NJ', 'Burlington County', '12/21/2017'),
 ('NC', 'Lee County', '1/14/2018'),
 ('NC', 'Alamance County', '11/28/2017'),]

Я хочу перебрать каждый элемент (кортеж) и, если он уже существует, удалить его из stList.

for item in stList:
    if item in stList:
        stList.remove(item)

Это не совсем работает. В основном, когда я запускаю это, если любой элемент в кортеже также находится в списке, он удаляет этот элемент, поэтому я получаю это:

[('NJ', 'Burlington County', '12/21/2017'),
 ('VA', 'Frederick County', '2/13/2018'),
 ('NJ', 'Burlington County', '12/21/2017'),
 ('NC', 'Alamance County', '11/28/2017')]

Как лучше подойти к этому?

1 Ответ

0 голосов
/ 14 сентября 2018

Вы можете сравнивать кортежи напрямую.

Кортежи со всеми совпадающими записями будут считаться равными.

>>> ('NJ', 'Burlington County', '12/21/2017') == ('NJ', 'Burlington County', '12/21/2017')
>>> True

>>> ('NJ', 'Burlington County', '12/21/2017') == ('NJ', 'Burlington County', '1/21/2017')
>>> False

Не удаляйте элементы из коллекции, для которой вы выполняете итерацию.

Это может привести к неожиданному поведению, если вы не знаете, как выполняется удаление, и делаете это правильно. Это другая история.

Вот несколько вариантов.

seen = set()
result = []
for item in stList:
    # Tuple can be compared directly to other tupled in `seen`.
    if item not in seen:
        seen.add(item)
        result.append(item)

stList = result

Другая возможность

seen = set()
# Use a list to preserve ordering. Change to set if that does not matter.
first_seen = []
for i, item in enumerate(stList):
    if item not in seen:
        seen.add(item)
        first_seen.append(i)

stList = [stList[i] for i in first_seen]

Редактировать Во-вторых, второй вариант не так хорош, как первый, если вам не нужны индексы по какой-то причине (т. Е. Они могут использоваться повторно для какой-то другой задачи), потому что result в первом случае хранит ссылки, а не копии кортежей, поэтому он будет более или менее занимать ту же память, что и индексы для этих кортежей в stList.

Если заказ не имеет значения

stList = list(set(stList))

Если вы просто хотите итерацию и вам не нужно индексировать stList, то вы даже можете сохранить ее как set объект.

...