无需迭代即可在词典列表中查找值

时间:2018-07-21 07:25:44

标签: python performance dictionary

假设我有一个列表my_list,并且该列表由字典组成。

my_list = [{'name': "Julia", 'Hello': 123}, {'name': "Carl", 'Hello': 456}, {'name': "John", 'Hello: 789}]

我想在该列表中找到具有特定键值的字典

def find_dictionary(hello_value):
    # Do the logic
    return my_dictionary

例如,find_dictionary(123)应该返回{'name': "Julia", 'Hello': 123}

我知道我可以迭代,但这是一个示例,当处理大量数据时,这种迭代会使我的代码变慢,并且我将需要做很多次...对数据进行迭代目前与之合作需要20秒钟的时间...有没有一种方法可以使其瞬时更快或更佳?

4 个答案:

答案 0 :(得分:2)

您可以预处理列表以将其转换为字典,以hello值作为键,而dicts作为值:

my_list = [{'name': "Julia", 'Hello': 123}, {'name': "Carl", 'Hello': 456}, {'name': "John", 'Hello': 789}]

find_dict = {d['Hello']: d for d in my_list}

print(find_dict[123])

# {'name': 'Julia', 'Hello': 123}

建筑物find_dict为O(n),随后的每次访问均为O(1)。

但是,如果您的值不是唯一的,则迭代列表会有所不同。 find_dict将保留包含您的值的最后一个字典,而在查找第一个字典时您可能已停止迭代。

答案 1 :(得分:2)

创建另一个字典以进行反向查找

>>> my_list = [{'name': "Julia", 'Hello': 123}, {'name': "Carl", 'Hello': 456}, {'name': "John", 'Hello': 789}]
>>> my_dict = {d[k]:d for d in my_list for k in d}

现在您可以轻松找到包含所需值的字典

>>> my_dict[123]
{'name': 'Julia', 'Hello': 123}
>>> my_dict['Carl']
{'name': 'Carl', 'Hello': 456}

答案 2 :(得分:0)

不能。您必须反复查找具有特定键值的字典。

答案 3 :(得分:0)

很高兴您认识到这样的问题。

但是,确实不能在O(1)操作中完成此任务,或者简单地说-如果不遍历列表,则无法从列表访问特定词典。

那么,还有什么选择?

如果您的需求不包括额外的空间使用量,则可以使用线性搜索代替线性搜索,从而将时间复杂度从O(n)大大降低到O(log n)。

如果您可以允许额外的O(n)空间,则可以寻求其他解决方案,因为它们将节省时间

用于恒定空间解决方案

先决条件:列表必须按hello_values排序

请参见下面的代码执行此操作:

def by_hello_value(elem):
    return elem['Hello']

my_list.sort(key=by_hello_value)

现在此列表已准备好进行二进制搜索:

def find_dictionary(hello_value):
    l=0
    r=len(my_list)-1
    while(l<=r):
        m = (int)((l+r)/2)
        if(my_list[m]['Hello']==hello_value):
            return my_list[m]
        if(my_list[m]['Hello']<hello_value):
            l=m+1
        else:
            r=m-1
    # return empty dictionary if required hello_valued dictionary is not present in list
    return {}

希望这会有所帮助。

是的,不要忘记在数据上共享此方法所花费的时间。您可以在注释部分中使用它。

继续提问,保持成长:)