在字典中查找带有...正则表达式的键?

时间:2015-03-23 09:53:53

标签: python regex python-2.7 dictionary

我有一个具有以下结构的字典:键是源和目标之间的链接,值是对象线的实例。

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 }

应用程序的逻辑是一样的。目的地不能有多个来源。因此,只有在提供目的地时才能找到巧合。

5 个答案:

答案 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)

只有伪造的代码可能有错误