удалить значения из Python dict - PullRequest
0 голосов
/ 01 сентября 2011

У меня был такой питон:

{'1' : {'1': {'A' : 34, 'B' : 23, 'C' : nan, 'D': inf, ...} ....} ....}

Для каждого «буквенного» ключа мне нужно было что-то вычислить, но я получил значения, такие как inf или nan, и мне нужно их удалить. Как я мог это сделать?

Моей первой попыткой было «обрезать» такие значения, то есть вернуть только значения от 0 до 1000, но когда я это сделал, я получил диктат с пустыми значениями:

{'1' : {'1': {'A' : 34, 'B' : 23, 'C' : {}, 'D': {}, ...} ....} ....}

возможно, есть лучшее решение, пожалуйста, помогите !!!!

Это часть моего кода, (Q и L - другие слова, которые содержат информацию, которую я должен вычислить):

for e in L.keys():
  dR[e] = {}
  for i in L[e].keys():
   dR[e][i] = {}
   for l, ivalue in L[e][i].iteritems():
     for j in Q[e].keys():
       dR[e][i][j] = {}
       for q, jvalue in Q[e][j].iteritems():
         deltaR = DeltaR(ivalue, jvalue) #this is a function that I create previously
         if (0 < deltaR < 100):
           dR[e][i][j] = deltaR

Ответы [ 2 ]

1 голос
/ 01 сентября 2011

Вы должны иметь возможность использовать оператор del для удаления элемента словаря. Например:

del dct['1']['1']['C']
0 голосов
/ 01 сентября 2011

Я делаю снимок в темноте, но вы, вероятно, можете сделать это несколькими способами. Один из методов - вычислить значение и затем решить, действительно ли вы хотите сохранить его, прежде чем вставить его в словарь.

d = {}
for letter in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ':
    # I don't actually know how you're calculating values
    # and it kind of doesn't matter
    value = calculate(letter)
    if value in (inf, nan):
        continue
    d[letter] = value

Я упрощаю словарь, чтобы обратить внимание только на ту часть ваших данных, которая фактически использует буквы в качестве ключей, поскольку вы на самом деле не указали никакого контекста. При этом, я бы, вероятно, согласился с первым предложением, если нет причин не делать этого.

for e in L.keys():
    dR[e] = {}
    for i in L[e].keys():
        dR[e][i] = {}
        for l, ivalue in L[e][i].iteritems():
            for j in Q[e].keys():
                #dR[e][i][j] = {} # What's up with this?  If you don't want an empty dict,
                                 # just don't create one.
                for q, jvalue in Q[e][j].iteritems():
                    deltaR = DeltaR(ivalue, jvalue) #this is a function that I create previously
                    if (0 < deltaR < 100):
                        dR[e][i][j] = deltaR
                if dR[e][i][j] in (nan, inf):
                    del dR[e][i][j]
...