我有一个具有以下结构的字典:键是源和目标之间的链接,值是对象线的实例。
wire_dict = { source1_destination1_1 : object,
source1_destination1_2 : object
source2_destination1_3 : object
source2_destination1_4 : object
source2_destination2_1 : object
source2_destination2_2 : object }
假设我只有一个目标值,并且我希望用正则表达式找到具有destination1_1
的键。如您所见,相同的源可以有多个目标,但不同的源不能具有相同的目标。所以我想找到以目的地结束的密钥。
由于wire_dict可能包含许多键值条目,请告诉我这种方法如何影响应用程序的性能。也许我应该只为源和目的地之间的关系创建另一个字典?
更新:我使用元组作为键更改字典:
wire_dict = { ('source1','destination1_1') : object1,
('source1','destination1_2') : object2
('source2','destination1_3') : object3
('source2','destination1_4') : object4
('source2','destination2_1') : object5
('source2','destination2_2') : object6 }
应用程序的逻辑是一样的。目的地不能有多个来源。因此,只有在提供目的地时才能找到巧合。
答案 0 :(得分:3)
通过dict键进行字符串搜索将是标准python词典的线性时间。但可以使用dict.keys()
和re
模块完成,因为@avim得到了有用的讲述。
对于第二个问题,而不是字符串键,如何将元组作为键:
{(begin, end): connection_object}
它根本不会加速(搜索很可能保持线性),但它可以在你想要表达的逻辑背后提供更好的代码。
答案 1 :(得分:0)
import re
wire_dict = {'source1_destination1_1' : 'object1',
'source1_destination1_2' : 'object2',
'source2_destination1_3' : 'object3',
'source2_destination1_4' : 'object4',
'source2_destination2_1' : 'object5',
'source2_destination2_2' : 'object6' }
pattern = 'source1_destination1_1'
print [value for key, value in wire_dict.items() if re.search(pattern, key)]
输出:
['object1']
答案 2 :(得分:0)
您只需要str.endswith
并迭代检查每个密钥的字典。
print([k for k in wire_dict if k.endswith("destination1_1")])
如果下一个只有一个以上的使用和一个生成器表达式:
k = next((k for k in wire_dict if k.endswith("destination1_1")),"")
如果您希望值使用wire_dict.get(k)
以防万一没有匹配,并且您从下一次调用返回一个空字符串。
In [18]: k = next((k for k in wire_dict if k.endswith("destination1_1")),"")
In [19]: wire_dict[k]
Out[19]: object
In [20]: k
Out[20]: 'source1_destination1_1'
除非你真的想要一个列表,否则你也不应该在python2中使用dict.keys
。您可以简单地遍历dict对象以有效地访问每个密钥。
答案 3 :(得分:0)
很容易在所有dict键上运行并找到与你的模式相匹配的键,但是对于大词典而言它很慢。
我认为您需要另一个带有与您的目的地匹配的键的字典(如您所想)。
答案 4 :(得分:0)
O bject 或面向 p 编程我的朋友
class Uberdict():
def init(source, destination, obj):
self.source, self.destination, self.obj = source, destination, obj
def has_destination(destination)
# True or False
return self.desination == destination
def has_source(source)
return self.source == source
wire_object_list = [
# list of the objects
]
# how to create them
example_obj = Uberdict(some_source, some_destination, some_instance)
wire_object_list.append(example_obj)
# filter
example_destination = 'some destination'
filtered_list = [item for item in wire_object_list if item.has_destination(example_destination)
只有伪造的代码可能有错误