Удаление подмножества dict из списка - PullRequest
6 голосов
/ 03 октября 2008

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

a = {1:'', 2:'', 3:'', 4:''}
exclusion = [3, 4, 5]

# have to build up a new list or the iteration breaks
toRemove = []
for var in a.iterkeys():
    if var in exclusion:
        toRemove.append(var)

for var in toRemove:
    del a[var]

Это может показаться необычным примером, но удивительно, сколько раз мне приходилось делать что-то подобное. Делать это с сетами было бы гораздо приятнее, но я явно хочу сохранить «ценности» для диктата.

Этот метод раздражает, поскольку требует двух циклов и дополнительного массива. Есть ли более чистый и эффективный способ сделать это.

Ответы [ 4 ]

12 голосов
/ 03 октября 2008

Рассмотрим dict.pop :

for key in exclusion:
     a.pop(key, None)

None предотвращает появление исключения, когда key не является ключом.

3 голосов
/ 03 октября 2008
a = dict((key,value) for (key,value) in a.iteritems() if key not in exclusion)
2 голосов
/ 03 октября 2008

Почему бы просто не использовать метод keys вместо iterkeys? Таким образом, вы можете сделать это за один цикл, потому что он возвращает список, а не итератор.

1 голос
/ 03 октября 2008

Вы можете изменить список исключений на набор, а затем просто использовать пересечение, чтобы получить перекрытие.

exclusion = set([3, 4, 5])

for key in exclusion.intersection(a):
    del a[key]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...