【问题标题】:how to build a tuplelist class in python whch is efficient when searching?如何在搜索时高效的python中构建一个元组列表类?
【发布时间】:2021-12-17 14:59:51
【问题描述】:

gurobi 构建一个元组列表类。see here. 它说这是 Python 列表类的自定义子类,旨在让您有效地从元组列表构建子列表。更具体地说,您可以对 tuplelist 对象使用 select 方法来检索与特定字段中的一个或多个指定值匹配的所有元组。 我已经测试过它的 select 方法,它非常有效。有谁知道如何实现像 gurobi 的元组列表类?

【问题讨论】:

    标签: python list search filter tuples


    【解决方案1】:
    # Search function with parameter list name
    # and the value to be searched
    def search(Tuple, n):
    
        for i in range(len(Tuple)):
            if Tuple[i] == n:
                return True
        return False
    
    # list which contains both string and numbers.
    Tuple= (1, 2, 'sachin', 4, 'Geeks', 6)
    
    
    # Driver Code
    n = 'Geeks'
    
    if search(Tuple, n):
        print("Found")
    else:
        print("Not Found")
    

    【讨论】:

      【解决方案2】:

      最简单的解决方案是将列表与元组中的每个条目配对。 dict 的键是一个元组值。 dict 的值是列表中的一组索引。像这样的:

      class TupleList:
          def __init__(self):
              self.lst = []
              self.dictlist = []
      
          def append(self, tup):
              dictlist = self.dictlist
              if dictlist and len(tup) != len(dictlist):
                  raise ValueError("All tuples must have same length")
              lst = self.lst
              tupidx = len(lst)
              lst.append(tup)
              if not dictlist: # first entry
                  self.dictlist = [{entry: set((tupidx,))} for entry in tup]
                  return
              for entry, dict_ in zip(tup, dictlist):
                  set_ = dict_.setdefault(entry, set())
                  set_.add(tupidx)
      
          def select(self, *args):
              # TODO: Implement '*' wildcard
              dictlist = self.dictlist
              if not dictlist:
                  return []
              if len(dictlist) != len(args):
                  raise KeyError("Wrong number of tuple values")
              tupsets = (dict_[arg] for dict_, arg in zip(dictlist, args))
              try:
                  intersect = next(tupsets)
                  for tupset in tupsets:
                      intersect = intersect.intersection(tupset)
              except KeyError: # value not present
                  return []
              lst = self.lst
              return [lst[idx] for idx in sorted(intersect)]
      

      【讨论】:

        猜你喜欢
        • 2011-02-24
        • 2021-06-26
        • 2018-09-02
        • 2014-05-01
        • 2015-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多