迭代包含一个键值对的字典列表

时间:2018-02-27 20:16:38

标签: python

我希望尽可能高效地遍历键值对列表。目的是遍历数据集以找到包含与我试图找到的代码对应的密钥的密钥值对,这嵌套在另一个循环中,该循环遍历一组代码。 我的徽标对象看起来像:

data_set = [{'key1': 'value'}, {'key2': 'value2'}, {'key3': 'value3'}, ]
codes = ['key1', 'key2', 'key3']

其中键对应于代码,值是我想要提取的数据

for code in codes:
    data = ''
    for idx, data_obj in enumerate(data_set):
        for (key, value) in data_obj.items():
            if key == code:
                data = value
                break
        if data != '':
            del data_set[idx]
            break
    do_something_with_data(data)

我的方法目前运行良好且速度相当快但我不禁想知道是否有更清洁/更快的方法

3 个答案:

答案 0 :(得分:4)

如果您的所有密钥都有一个 dict,这将是微不足道的,可以使用dict.pop(key[,default])完成。

在列表中的几个1键字符串中使用disjunct键是一个非常糟糕的数据结构选择 - 你应该将它们固化成一个大字典,以便能够对键进行O(1)访问,而不是在事后将列表操作为形状

具有多个密钥的dict的解决方案,如果它们在您的代码列表中,将从它中消失:

data_set = {'key1': 'value', 'key2': 'value2', 'key3': 'value3'} # use a dict
codes = ['key1', 'key2', 'key3']

for code in codes:
    data = data_set.pop(code, None) # get value & remove key, return None if not there
    if data:
        print(data) # do something with the data
print(data_set)

输出:

value
value2
value3
{}

从第三方获取数据时:

ds = [{'key1': 'value'}, {'key2': 'value2'}, {'key3': 'value3'}, ] 
data_set = { key:value for x in ds for key,value in x.items() }
print(data_set)

输出:

{'key1': 'value', 'key2': 'value2', 'key3': 'value3'} 

答案 1 :(得分:2)

这应该可以加快速度

codes_set = set(codes)
values = [v for d in data_set for k, v in d if k in codes_set]

values应该是您要查找的值列表。它肯定比你的版本更快,因为它使用O(1)set lookup

答案 2 :(得分:1)

此解决方案对整个=iif(Previous(Fields!firstgrandparentvalue.Value)= Fields!secondgrandparentvalue.Value, true,false)解决方案使用列表推导:

O(n^2)

输出:

data_set = [{'key1': 'value'}, {'key2': 'value2'}, {'key3': 'value3'}, ]
codes = ['key1', 'key2', 'key3']
new_data_set = [i for i in data_set if any(code in i for code in codes)]