Как я могу использовать операторы if для диктонарных ключей и заполнить другой диктант? - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть словарь со структурой здесь

'set1':{ 'status': 1,
            'data': {'1': {'C': ['116.587',
                                 '52.674',
                                 '23.164',
                                 '8.5'],
                            <sth>:...},
                    {'2': {'C': ['11.507',
                                 '50.674',
                                 '23.004',
                                 '8.02'],
                            <sth>:...},
                    {'3': {'C': ['16.587',
                                 '2.674',
                                 '3.164',
                                 '0.5'],
                            <sth>:...} 
                    {'4': {'C': ['0.587',
                                 '1.674',
                                 '3.009',
                                 '0.55'],
                            <sth>:...} 

'set2':{ 'status': 1,
             'data': {'3': {'C': ['116.587',
                                 '52.674',
                                 '23.164',
                                 '8.5'],
                            <sth>:...}
#<goes like this>

Мне нужно хранить информацию под C для всех каналов '1', '2', '3' и '4' для всех наборов, которые более 100к.Но не все наборы имеют 4 канала, но имеют только «3» и «4», или только «1» и «2», например.Я пытаюсь заполнить несуществующие каналы нулями.

Я пытался использовать это утверждение if( idict[n]["data"][c] ): Я думаю, что если это правда, например, idict ["set1"] ["data"] ["1"] истинно, он должен заполнить канал '1', иначеон должен заполниться '0,000'.

idict - это входной dict, odict - это выходной dict

    for n in idict: #n is the set number
        try:
            if(idict[n]["status"]==1 and idict[n]["data"]):
               #some has status=0 or has no data key. I need to ignore those
                odict[n] = []
                for c in ('1','2','3','4'):
                    if( idict[n]["data"][c] ): #THIS IS WHAT I USED FOR THIS ISSUE
                        odict[n].append({
                            c : [
                                str(idict[n]["data"][c]["C"][0]),
                                str(idict[n]["data"][c]["C"][1]),
                                str(idict[n]["data"][c]["C"][2]),
                                str(idict[n]["data"][c]["C"][3])
                            ]
                            #indicies after ["C"] are for the 4 non integer entries 
                        })
                    else:
                        odict[n].append({
                            c : ['0.000','0.000','0.000','0.000']
                        })
        except KeyError:
            continue

Выход должен быть как

'set1':{ 
                   {'1': ['116.587','52.674','23.164','8.5']
                    {'2': ['11.507','50.674','23.004','8.02']
                    {'3': ['16.587','2.674','3.164','0.5']
                    {'4': ['0.587','1.674','3.009','0.55']
        }

'set2':{ 
                     '3': ['116.587','52.674,'23.164','8.5'],
                     '4': [<something similar>]
         }
#<goes like this>

, но яесть пустые словари для наборов, в которых отсутствуют некоторые каналы, но наборы с 4 каналами заполнены.

Благодарим за любую помощь.

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Я нашел это. Вместо

if( idict[n]["data"][c] ):

Я должен был использовать

if c in idict[str(n)]["data"]:

Теперь это работает.

Спасибо за все усилия.

0 голосов
/ 11 апреля 2019

Попробуйте использовать ключевое слово python 'in', чтобы проверить, присутствует ли ключ в словаре

ex:

if key in idict:
    <rest of the code>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...