У меня есть dict
, скажем, например, этоесть лучший способ очистить диктофон?
data={k:k for k in range(20)}
я сделать некоторые операции над значениями data
и некоторые из ванной в качестве 0, например, это
for k,v in data.items():
data[k] %= 2
при этом я хочу чтобы удалить все ключи, которые получают значение 0, но выполнение на мухе дает ошибку, поэтому я должен сделать это в конце, для этого я делаю
def clean(data):
while True:
try:
for k,v in data.items():
if not v:
del data[k]
return
except RuntimeError:
pass
, так что мой вопрос: есть лучший способ сделать это, поэтому я делаю remotion на месте и избегаю использовать дополнительную память и еще лучше в одну поездку ??
EDIT
это похоже на мой предназначению
class MapDict(dict):
def __repr__(self):
return '{}({})'.format(self.__class__.__qualname__, super().__repr__())
def map(self,func,*argv):
'''applicate func to every value in this MapDict'''
for k,v in self.items():
self[k] = func(v,*argv)
self.clean()
def clean(self):
while True:
try:
for k,v in self.items():
if not v:
del self[k]
return
except RuntimeError:
pass
>>> data=MapDict((k,k) for k in range(20))
>>> data
MapDict({0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19})
>>> from operator import add, mod
>>> data.map(mod,2)
>>> data
MapDict({1: 1, 3: 1, 5: 1, 7: 1, 9: 1, 11: 1, 13: 1, 15: 1, 17: 1, 19: 1})
>>> data.map(add,10)
>>> data
MapDict({1: 11, 3: 11, 5: 11, 7: 11, 9: 11, 11: 11, 13: 11, 15: 11, 17: 11, 19: 11})
>>>
так, поэтому я не мог сделать новый dict
, и я хочу, чтобы держать только в моем случае только соответствующие значения , что позже мне нужно что-то еще.
Так есть лучший способ сделать это чистым? сохраняя при этом эффективность памяти? и в наименьшей сумме поездки?
См http://stackoverflow.com/questions/9023078/custom-dict-that-allows-delete-during-iteration – Stuart
Вы, вероятно, не хотите писать подклассы так, я хотел бы посмотреть в к одной из функциональных программных библиотек (toolz, funcy и т. д.), которые обеспечивают отличные функции потоковой передачи для большинства этих функций. – tacaswell
@tcaswell, возможно, карта является плохим именем для этого метода, но это именно то, что я хочу, выполняю операцию на месте, но 'toolz' отлично смотрится для операций, которые я делаю, которые не на месте – Copperfield