我想要使用四对配对值的词典列表。问题是dictionary.values()
可以按照键发生的顺序返回值。这可能会影响配对有效的生成器/迭代器消耗列表。
考虑以下因素:
import itertools
formfielddata=[
{'value': '10.16.0.4', 'param': 'target_ips'},
{'value': '10.16.0.6', 'param': 'target_ips_6'},
{'param': 'target_ips_7', 'value': '10.16.0.7'},
{'value': '10.16.0.8', 'param': 'target_ips_8'},
{'param': 'target_ips_9', 'value': '10.16.0.9'},
{'value': '10.16.0.10', 'param': 'target_ips_10'},
{'value': '10.16.0.11', 'param': 'target_ips_11'},
]
apiargs={}
print("%s" % ([dict(zip(*[iter(f.values())]*2)) for f in formfielddata]))
[apiargs.update(dict(zip(*[iter(f.values())]*2))) for f in formfielddata]
print("%s" % (apiargs))
产生:
[ {'target_ips': '10.16.0.4'},
{'target_ips_6': '10.16.0.6'},
{'10.16.0.7': 'target_ips_7'},
{'target_ips_8': '10.16.0.8'},
{'10.16.0.9': 'target_ips_9'},
{'target_ips_10': '10.16.0.10'},
{'target_ips_11': '10.16.0.11'}]
{ '10.16.0.7': 'target_ips_7',
'10.16.0.9': 'target_ips_9',
'target_ips': '10.16.0.4',
'target_ips_10': '10.16.0.10',
'target_ips_11': '10.16.0.11',
'target_ips_6': '10.16.0.6',
'target_ips_8': '10.16.0.8'}
正如您所看到的,混合值排序会混淆生成的字典。有没有办法可以将有序的键列表放入字典或生成器中,以便根据特定的顺序获取值?
编辑:
我对这个具体案例的字典理解结束了,但是特定的顺序答案对于做其他事情非常有用,所以我也想特别提及它。
如果字典内容包含一个固定的键列表,我可以依赖它始终存在(例如我正在处理的多部分表单)R Nar的答案在下面是最有意义的(它没有& #39; t需要遍历列表索引。)
然而,我发现,在不同的应用程序中我想要一个动态的属性/值对列表用作Redis的索引,集合排序结果非常方便。我有一个API的大约188个可能的请求参数,我不想要重复请求。因此,我想创建一个参数排序的主列表,以便相同的请求参数可以用作Redis缓存键的一部分。这是如何工作的:
def build_redis_key(self, endpoint, **kwargs):
'''
builds the key fingerprint
'''
intersect = sorted(set(kwargs.keys()), key = api_param_key_order.index)
return endpoint.join(['|%s=%s' % (key,kwargs[key]) for key in intersect])
答案 0 :(得分:2)
用f.values
替换(v for k,v in sorted(f.items(), key=lambda x:preferred_order.index(x[0])))
应该这样做:
import itertools
from pprint import pprint
formfielddata = [
{'value': '10.16.0.4', 'param': 'target_ips'},
{'value': '10.16.0.6', 'param': 'target_ips_6'},
{'param': 'target_ips_7', 'value': '10.16.0.7'},
{'value': '10.16.0.8', 'param': 'target_ips_8'},
{'param': 'target_ips_9', 'value': '10.16.0.9'},
{'value': '10.16.0.10', 'param': 'target_ips_10'},
{'value': '10.16.0.11', 'param': 'target_ips_11'},
]
preferred_order = ['param', 'value']
apiargs = {}
pprint("%s" % ([dict(zip(*[iter(
(v for k, v in sorted(f.items(), key=lambda x:preferred_order.index(x[0])))
)]*2)) for f in formfielddata]))
[apiargs.update(dict(zip(*[iter(
(v for k, v in sorted(f.items(), key=lambda x:preferred_order.index(x[0])))
)]*2))) for f in formfielddata]
pprint("%s" % (apiargs))