假设我有一个列表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秒钟的时间...有没有一种方法可以使其瞬时更快或更佳?
答案 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 {}
希望这会有所帮助。
是的,不要忘记在数据上共享此方法所花费的时间。您可以在注释部分中使用它。
继续提问,保持成长:)