Python(如果有区别的话,则为3)字典和生成器的特定列表结果顺序

Python(如果有区别的话,则为3)字典和生成器的特定列表结果顺序,python,list,dictionary,tuples,generator,Python,List,Dictionary,Tuples,Generator,我想使用四对值字典的列表。问题是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', 'val

我想使用四对值字典的列表。问题是
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的答案最有意义(它不需要遍历列表索引)

然而,我发现,在另一个应用程序中,我希望将属性/值对的动态列表用作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])

f.values
替换为
(v表示k,v表示已排序(f.items(),key=lambda x:preferred\u 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))

您想通过以相同但任意的顺序给出的相同键检索两个字典的值吗?每个dict都有相同的键,因此您可以轻松地执行dict comp,如forfielddata}^hmmmm中d的
{d['value']:d['param']。我一有机会就去试试!作为旁注,
%
操作符已经开始在Python3中被弃用:注意:要解决您的大问题,请使用像R Nar建议的dict理解。