与此同时,我提出了三种不同的解决方案。
1.常用词典
第一个是通用字典,它使用每个唯一字段作为键,并将在字典中转换的完整组元组作为值。这不需要一个类,一个返回公共字典的函数就足够了。这是一个测试函数:
def build_structure(data, indexes=(0, )):
result = {}
for elem in data:
for index in indexes:
result[elem[index]] = elem
return result
使用示例列表,返回的结构是这样的:
{
Banana: {key1: Banana, key2: myBanana, value1: fruit, value2: True},
myBanana: {key1: Banana, key2: myBanana, value1: fruit, value2: True},
...: {..:..},
myCar: {key1: Car, key2: myCar, value1: vehicle, value2: False},
}
当数据增长时,这不会占用太多内存,因为每个值都是对完整组字典的引用,很容易使用,因为我可以调用 structure['somekey'] 并直接获取结果,附加值只是一个问题structure.update(structure_func(new_data));实现也非常简单,但有一些副作用:它返回一个(显然无序的)字典,其中也包含搜索键本身,而我更愿意在没有搜索键的情况下保持插入顺序,如果你有两个相似的键在不同的关键字段中,结果将被覆盖。
2。倒轴列表列表
第二种解决方案是使用来自原始给定数据的列表列表的类,其中每个嵌入列表实际上包含每个组数据列表的字段值。测试代码:
class MyStructure(object):
def __init__(self, data):
self.data = [[data[i][col] for i in range(len(data))] for col in range(len(data[0]))]
def get(self, col, data):
index = self.data[col].index(data)
return [self.data[c][index] for c in range(len(self.data)) if c!= col]
def append(self, data):
for i, v in enumerate(data):
self.data[i].append(v)
那么,最终的结构应该是这样的:
[[Banana, Water, Car],
[myBanana, myWater, myCar],
[fruit, liquid, vehicle],
[True, True, False]]
第一个解决方案(使用简单的结构.get())的唯一缺点是搜索查询将首先涉及给定字段的 list.index(),然后是 data[field_id][index ] 对于所有其他搜索字段。此外,您必须知道搜索查询的字段 ID。
3.带有列表参考的字典
第三种解决方案是一个类,它使用原始列表列表和一个包含每个关键字段的字典的列表,该字典引用了前面提到的列表索引。结构是这样的:
[{
Banana: [Banana, myBanana, fruit, True],
Water: [Water, myWater, liquid, True],
[...]
},
{
myBanana: [Banana, myBanana, fruit, True],
[...]
}]
再次,调用搜索查询要求用户知道搜索将发生的字段:给定字段 id 和搜索键,该方法将为该 dict 执行 get 并返回其他字段值的列表 (减去给定的键)。我还可以创建一个搜索每个搜索字段并返回可能匹配项列表的方法。
这是我做的一个测试类:
class NewStructure(object):
def __init__(self, data):
self.data = data
self.field_dicts = []
for field in range(len(data[0])):
self.field_dicts.append({data[index][field]:item for index, item in enumerate(data)})
def get(self, column, value):
return [v for i, v in enumerate(self.field_dicts[column][value]) if i!=column]
def append(self, data):
self.data.append(data)
for index, field in enumerate(self.field_dicts):
field[data[index]] = self.data[-1]```
这实际上是一个复杂得多的解决方案,但我认为它比其他的更有优势:原始数据结构永远不会改变,即使不同字段有相似的键;当主数据结构增长时,字典的实际增长是最小的,因为它们只包含对主数据结构索引的引用。在给定的示例中,我使用 every 字段作为可能的搜索字段,将允许的搜索字段索引添加到 __init__ 可能会使用更少的内存:例如,指定只有前两个字段可以搜索字段,只需要 2 个参考词典,而不是 4 个。
我想应该根据他/她的情况选择解决方案。在我的情况下,我实际上并不需要“实时”结果,我认为我会坚持最后一个解决方案,可能会添加动态方法创建并在类 init 上要求字段名称,允许类似 structure.get_from_key1(Banana) 的东西。
但是。我不是程序员,我只是为了好玩;所以,如果有人有其他想法,我想知道,即使只是想了解不同的观点。 :)
谢谢!
PS:另外,如果有人对这个问题有更好更清晰的标题,我很乐意编辑它。