【问题标题】: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)]