1

タイトルに少し戸惑うかもしれませんが、この問題に直面している人があまりにも多く、そのほとんどが解決方法を知っていると確信しています。

これが私の問題です。以下のようなdictオブジェクトがあります:

{   'fields':
    ['Config', 'Device', 'Device Name', 'Config Name', 'description', 'ip', 'radius', 'ssid','vlan', 'channel', 'frequency', 'maxclients', 'username', 'password', 'enable_password','transport_protocol', 'personality', 'date_added', 'date_modified'],
    'results': [
    [23, 45, 'New test2 for demo', 'New test2 for demo', 'Default desc for device','192.168.0.100',13, '0', 0, 4, 'None', None, 'Cisco', 'Cisco', 'Cisco', 'Telnet', 'ios',datetime.datetime(2013, 3, 6, 13, 52, 14), datetime.datetime(2013, 3, 7, 14, 27, 39)],
    [23, 47, 'Test after a couple hours', 'New test2 for demo', 'Default desc for device','192.168.0.100', 13, '0', 0, 4, 'None', None, 'Cisco', 'Cisco', 'Cisco', 'Telnet', 'ios',datetime.datetime(2013, 3, 6, 13, 52, 14), datetime.datetime(2013, 3, 7, 14, 27, 39)]
    ]
}

次のような dict オブジェクトを含むリストに変換したいと思います。

[
{'username': 'Cisco', 'transport_protocol': 'Telnet', 'Device Name': 'With a fresh breath','description': 'Default desc for device', 'date_added': datetime.datetime(2013, 3, 8, 9, 32, 13),'date_modified': datetime.datetime(2013, 3, 8, 9, 32, 13), 'ip': '192.168.0.100', 'vlan': 0,'enable_password': 'Cisco', 'Config Name': 'With a fresh breath', 'frequency': '0', 'radius': 0, 'personality': 'ios', 'Device': 49, 'maxclients': 0, 'password': 'Cisco', 'Config': 27, 'channel': 0, 'ssid': 'LBREAP'}, 
{'username': 'Cisco', 'transport_protocol': 'Telnet', 'Device Name': 'With a fresh breath for second device', 'description': 'Default desc for device', 'date_added': datetime.datetime(2013, 3, 8, 9, 33, 57), 'date_modified': datetime.datetime(2013, 3, 8, 11, 23, 1), 'ip': '192.168.0.35', 'vlan': 0, 'enable_password': 'Cisco', 'Config Name': 'With a fresh breath for second device', 'frequency': '0', 'radius': 0, 'personality': 'ios', 'Device': 50, 'maxclients': 0, 'password': 'Cisco', 'Config': 28, 'channel': 4, 'ssid': 'LBREAP'}
]

トップ オブジェクト フィールドを、リストを使用して 2 番目のオブジェクト キーにマップする必要があります。2 番目の for を作成するための簡単な for を作成しましたが、動作します。これで 2 番目の for を既に作成していますが、それを機能させる簡単な方法があることに興味があります。

ここに私のループがあります:

results = list()
if configSet['results']:
   k = 0
   for i in configSet['results']:
       rSet = {}
       r = 0
       for f in i:
           rSet[configSet['fields'][r]] = f
           r += 1
       results.insert(k, rSet)
       k += 1

このようなdict、list、map、zipの組み合わせで処理しようとしています

dict(map(list, zip(configSet['fields'], configSet['results'])))

しかし、それは私にはうまくいきませんでした。

それを行うためのより良い、迅速かつ簡単な方法を私に提案する人はいますか?

よろしく。

4

2 に答える 2

6
[dict(zip(configSet['fields'], result)) for result in configSet['results']]

の各結果について、結果のキーと値resultsを使用して dict を作成します。fields

In [6]: [dict(zip(configSet['fields'], result)) for result in configSet['results']]
Out[6]:
[{'Config': 23,
  'Config Name': 'New test2 for demo',
  'Device': 45,
  'Device Name': 'New test2 for demo',
  'channel': 4,
  'date_added': datetime.datetime(2013, 3, 6, 13, 52, 14),
  'date_modified': datetime.datetime(2013, 3, 7, 14, 27, 39),
  'description': 'Default desc for device',
  'enable_password': 'Cisco',
  'frequency': 'None',
  'ip': '192.168.0.100',
  'maxclients': None,
  'password': 'Cisco',
  'personality': 'ios',
  'radius': 13,
  'ssid': '0',
  'transport_protocol': 'Telnet',
  'username': 'Cisco',
  'vlan': 0},
 {'Config': 23,
  'Config Name': 'New test2 for demo',
  'Device': 47,
  'Device Name': 'Test after a couple hours',
  'channel': 4,
  'date_added': datetime.datetime(2013, 3, 6, 13, 52, 14),
  'date_modified': datetime.datetime(2013, 3, 7, 14, 27, 39),
  'description': 'Default desc for device',
  'enable_password': 'Cisco',
  'frequency': 'None',
  'ip': '192.168.0.100',
  'maxclients': None,
  'password': 'Cisco',
  'personality': 'ios',
  'radius': 13,
  'ssid': '0',
  'transport_protocol': 'Telnet',
  'username': 'Cisco',
  'vlan': 0}]
于 2013-03-08T12:26:18.400 に答える
0

「新鮮な呼吸」がどこで得られるかはわかりませんが、これはあなたがやりたいことだと思います:

d={'fields':['Config',...],'results': [[23,...],[23,...]]}
keys=['username', 'transport_protocol', 'Device Name', ...]
resultlist = [{field:value for field,value in zip(keys, [v[d['fields'].index(k)] for k in keys])} for v in d['results']]

編集:dict(keys, values)私の紛らわしい ではなくバリアントを使用する主な回答を見た{key:value for key,value in ...}ので、私のものはせいぜい冗長です。それにもかかわらず、私の答えが何らかの形で関連していることを願っています。それは、最初はあなたの目標だと思っていたサブセットからキーを選択できることです。

出力:

[
  {'username': 'Cisco', 'transport_protocol': 'Telnet', 'Device Name': 'New test2 for demo'}, 
  {'username': 'Cisco', 'transport_protocol': 'Telnet', 'Device Name': 'Test after a couple hours'}
]
于 2013-03-08T12:53:31.090 に答える