Python:存储用于检查容器中项目存在的项目的优雅方式

时间:2016-10-18 19:37:02

标签: python

在我遇到的情况下,我想定义"优雅"具有 1)常数O(1)时间复杂度用于检查项目是否存在且 2)仅存储项目,仅此而已。

例如,如果我使用列表

num_list = []
for num in range(10): # Dummy operation to fill the container.
    num_list += num
if 1 in num_list:
    print("Number exists!")

操作" in"根据[Link]

O(n)时间

为了实现不断的检查时间,我可以使用字典

num_dict = {}
for num in range(10): # Dummy operation to fill the container.
    num_dict[num] = True
if 1 in num_dict:
    print("Number exists!")

在字典的情况下,操作"在"根据[Link],费用 O(1)时间,但存储虚拟值需要额外的 O(n)存储空间。因此,两个实现/容器似乎都不优雅。

什么是更好的实现/容器来实现持续O(1)时间来检查项目是否存在而仅存储项目?如何将资源需求保持在最低限度?

2 个答案:

答案 0 :(得分:1)

这里的解决方案是使用import numpy as np import pandas as pd from sklearn import linear_model, metrics, pipeline, preprocessing df = pd.DataFrame({'a':range(12), 'b':[1,2,3,1,2,3,1,2,3,3,1,2], 'c':['a', 'b', 'c']*4, 'd': ['m', 'f']*6}) y = df.a num = df[['b']] cat = df[['c', 'd']] from sklearn.feature_extraction import DictVectorizer enc = DictVectorizer(sparse = False) enc_data = enc.fit_transform(cat .T.to_dict().values()) crat = pd.DataFrame(enc_data, columns=enc.get_feature_names()) X = pd.concat([crat, num], axis=1) cat_columns = ['c=a', 'c=b', 'c=c', 'd=f', 'd=m'] cat_indices = np.array([(column in cat_columns) for column in X.columns], dtype = bool) numeric_col = ['b'] num_indices = np.array([(column in numeric_col) for column in X.columns], dtype = bool) reg = linear_model.SGDRegressor() estimator = pipeline.Pipeline(steps = [ ('feature_processing', pipeline.FeatureUnion(transformer_list = [ ('categorical', preprocessing.FunctionTransformer(lambda data: data[:, cat_indices])), #numeric ('numeric', pipeline.Pipeline(steps = [ ('select', preprocessing.FunctionTransformer(lambda data: data[:, num_indices])), ('scale', preprocessing.StandardScaler()) ])) ])), ('model', reg) ] ) estimator.fit(X, y) ,它不需要为每个值保存虚拟变量。

答案 1 :(得分:0)

通常,您无法同时优化空间和时间。你可以做的一件事是有关于数据范围的更多细节(这里是num的最小值到最大值)和数据大小(这里是循环运行的次数,即10。)。那么你将有两个选择:

  1. 如果范围有限,则转到字典方法(甚至使用数组索引方法)
  2. 如果尺寸有限,请转到列表方法。
  3. 如果您选择正确的方法,那么您可能会获得大样本的恒定时间和空间

    编辑: 设置 它是一个哈希表,与Python字典非常类似地实现了一些优化,这些优化利用了值总是为空的事实(在集合中,我们只关心键)。集合操作确实需要对至少一个操作数表进行迭代(在union的情况下都是如此)。 迭代并不比任何其他集合(O(n))便宜,但成员资格测试平均为O(1)。