【问题标题】:Lookup for a key in dictionary with... regular expressions?用...正则表达式在字典中查找键?
【发布时间】:2015-05-26 06:22:37
【问题描述】:

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

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 }

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

【问题讨论】:

  • 您的数据组织不能有效地支持此操作...您应该真正遵循 progo 的建议并使用对而不是字符串。此外,如果您跟踪哪些来源与目的地相关联,您就可以在不扫描所有条目的情况下获得所需的结果。
  • @Bakuriu 我编辑了帖子。请参阅上面的更新。

标签: python regex python-2.7 dictionary


【解决方案1】:

Object o面向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)

只有伪代码可能有错误

【讨论】:

    【解决方案2】:

    您只需要str.endswith 并遍历字典检查每个键。

    print([k for k in wire_dict if k.endswith("destination1_1")])
    

    如果只有一次以上的使用 next 和一个生成器表达式:

    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】:

      遍历所有 dict 键并找到与您的模式匹配的键很容易,但对于大型 dict 来说速度很慢。

      我认为您需要另一个带有与您的目的地匹配的键的字典(如您所想)。

      【讨论】:

        【解决方案4】:

        通过 dict 键进行字符串搜索将是标准 Python 字典的线性时间。但正如@avim 所说,它可以通过dict.keys()re 模块来完成。

        对于第二个问题,而不是字符串键,将元组作为键怎么样:

        {(begin, end): connection_object}
        

        它根本不会加速(搜索可能保持线性),但它可以在您想要表达的逻辑后面实现更好的代码。

        【讨论】:

        • 我已经按照您的建议将元组设置为键:{('source_1', 'destination_1'): 'object1'}。但是,问题几乎相同。我需要找到一个关键,任何巧合,只需提供,例如'destination_1'。我很确定只有一个巧合,应用的逻辑是目的地只有一个来源。
        【解决方案5】:
        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']
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-26
          • 2011-05-20
          • 1970-01-01
          • 2018-08-10
          • 1970-01-01
          • 2012-06-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多