2016-03-05 2 views
0

Мне нужно удалить любые элементы, которые имеют значение None для определенной клавиши dict в наборе python. С учетом простого набора:удалить элементы из набора, которые проходят определенный тест python

In [7]: z 
Out[7]: {None, 1, 2} 

In [8]: for item in z: 
    ...:  if not item: 
    ...:   z.remove(item) 
    ...:   
--------------------------------------------------------------------------- 
RuntimeError        Traceback (most recent call last) 
<ipython-input-8-680a51a37622> in <module>() 
----> 1 for item in z: 
     2  if not item: 
     3   z.remove(item) 
     4 

RuntimeError: Set changed size during iteration 

Не могу понять, почему, но он не позволит мне удалять объекты во время итерации. Как запустить динамическую проверку прав и удалить элементы из наборов? Спасибо

+1

'z = {item for item in z if item is not None}' –

+1

@PeterWood, его тест был для правдивости, а не для нести. Попробуйте: 'z = {item for item in z if item}' –

+1

@ Robᵩ Это удалит '0' из набора. –

ответ

2

Роб имеет хороший ответ, если вы хотите сохранить структуру своего кода; в противном случае вы можете использовать понимание, чтобы сделать это в одной строке.

example_set = {None, 1, 2} 
filtered_set = {item for item in example_set if item} 

print(filtered_set) # {1, 2} 

Если ваша логика является более сложной, чем просто if item, то это, вероятно, лучше держать петлю for.

2

Попробуйте сделать копию набора первой:

for item in list(z): 
    if not item: 
     z.remove(item) 
+0

Хотя я согласен с подходом, почему бы не 'z.copy()' вместо 'list (z)'? –

0

Эта ошибка очень часто встречается, когда for цикл используется, чтобы идти по списку или словаря. Проблема в том, что вы намерены изменить содержимое словаря, пока вы это просматриваете.

В этом случае одно решения использовать индекс для прогулки по словарю, что-то вроде:

for i in range(len(dic)): 

Но вы используете SET, то SET объекта в Python 3 есть метод, называемый discard, что вы можете используйте то, что вы намеревались. Например:

z = {None, 1, 2} 
z.discard(None) 
print(z) 
Смежные вопросы