Объединение словарей с отдельными записями - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть это:

[[{'end': 3250741247,
   'ip_range': '193.194.64.0 - 193.194.95.255',
   'start': 3250733056},
  {'descr': 'PROVIDER'},
  {'descr': 'Algerian Academic Research Network'},
  {'country': 'DZ'}],
 [{'end': 3273187327,
   'ip_range': '195.24.192.0 - 195.24.223.255',
   'start': 3273179136},
  {'descr': 'Data communication and international'},
  {'descr': 'telecommunication of Cameroon'},
  {'country': 'CM'}]]

Есть ли способ объединить клавиши 'descr', чтобы удерживать два (или более) значения под одной и той же клавишей.

Я хочу что-токак это:

[[{'end': 3250741247,
   'ip_range': '193.194.64.0 - 193.194.95.255',
   'start': 3250733056},
  {'descr': 'PROVIDER','Algerian Academic Research Network'},
  {'country': 'DZ'}],
 [{'end': 3273187327,
   'ip_range': '195.24.192.0 - 195.24.223.255',
   'start': 3273179136},
  {'descr': 'Data communication and international','telecommunication of Cameroon'},
  {'country': 'CM'}]]

это возможно?если да, то как?

Я пробовал это, но это не сработало:

for block in result:
    description = {}
    for dic in block:
        if dic.__contains__('descr'):
            description = {i:j for i in dic.keys() for j in zip(dic.values(),description.values())}
    block.append(description)

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019
lst = [[{'end': 3250741247,
   'ip_range': '193.194.64.0 - 193.194.95.255',
   'start': 3250733056},
  {'descr': 'PROVIDER'},
  {'descr': 'Algerian Academic Research Network'},
  {'country': 'DZ'}],
 [{'end': 3273187327,
   'ip_range': '195.24.192.0 - 195.24.223.255',
   'start': 3273179136},
  {'descr': 'Data communication and international'},
  {'descr': 'telecommunication of Cameroon'},
  {'country': 'CM'}]]
# container for output list
new_list = []

# Loop through all the nested lists
for ls in lst:
    # container to capture the value of the 'descr' key
    descrval = []
    # container to capture the index of the dict in nested list
    descridx = []
    # now we loop through all the dicts in nested lists
    for i, dct in enumerate(ls):
        # if the 'descr' key exists, we capture it
        if 'descr' in dct.keys():
            descrval.append(dct['descr'])  # value
            descidx.append(i)  # nested list index
    # remove all existing dicts
    for i in sorted(descridx, ascending=False):
        ls.pop(i)
    # pops back the joint dict for the 'descr' key
    ls.append({'descr':descrval})
    # pushes the new list to the output list
    new_list.append(ls)

Примечание: я построил это исключительно в текстовом поле и не запускал никаких тестов на нем.Пожалуйста, проверьте правильность лично.

0 голосов
/ 19 февраля 2019

Держа это близко к тому, что у вас есть, я бы сделал нечто подобное для вашего примера:

lists = [[{'end': 3250741247,
           'ip_range': '193.194.64.0 - 193.194.95.255',
           'start': 3250733056},
          {'descr': 'PROVIDER'},
          {'descr': 'Algerian Academic Research Network'},
          {'country': 'DZ'}],
         [{'end': 3273187327,
           'ip_range': '195.24.192.0 - 195.24.223.255',
           'start': 3273179136},
          {'descr': 'Data communication and international'},
          {'descr': 'telecommunication of Cameroon'},
          {'country': 'CM'}]
         ]
result = []
for list in lists:
    result.append({})
    for d in list:
        for key in d:
            if key in result[-1]: result[-1][key] += d[key]
            else                : result[-1][key]  = d[key]
print(result)

Выход:

[{'end': 3250741247, 'ip_range': '193.194.64.0 - 193.194.95.255', 'start': 3250733056, 'descr': 'PROVIDERAlgerian Academic Research Network', 'country': 'DZ'}, {'end': 3273187327, 'ip_range': '195.24.192.0 - 195.24.223.255', 'start': 3273179136, 'descr': 'Data communication and internationaltelecommunication of Cameroon', 'country': 'CM'}]

Примечание. Я объединяю в своем результате отдельноесловари к одному.Кроме того, вы можете захотеть сделать что-то более продвинутое в комбинации, а не +=, например += (" " + d[key]), чтобы добавить пробел, но это сломало бы не строки.Как вы можете улучшить это, зависит только от вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...