在输入特定值时在列表中定位字典

时间:2016-11-13 16:03:20

标签: python list dictionary

让我们说下面有一些字典表示为字典:

cluster1 = {'Disks' : [0,1,2,3,12] , 'left': True , 'right': False}
cluster2 = {'Disks' : [3,4,5,2] , 'left':True ,'right': False }
cluster3 = {'Disks' : [6,7,8,2] , 'left':False ,'right': False }
cluster4 = {'Disks' : [10,11,12] , 'left':True, 'right':True  }

Listofclusters = [cluster1,cluster2,cluster3,cluster4]

然后我按上面列出了一些群集来存储它们....

如果我想在列表中搜索特定磁盘,并希望它告诉我列表中的哪些群集有这些磁盘 我该怎么做?

3 个答案:

答案 0 :(得分:2)

根据您拥有的数据,我们应该这样做:

def findClusters(n, clusters):
    answer = []
    for cluster in clusters:
        if n in cluster['Disks']:
            answer.append(cluster)
    return answer

现在,这是一个线性算法。通过一些预处理,您应该能够大大改善运行时间:

def preprocess(clusters):
    """
    Given the list of clusters, return a dictionary that maps 
    Disk numbers to a list of clusters that have that disk
    """

    answer = {}
    for i,cluster in enumerate(clusters):
        for disk in cluster['Disks']
            if disk not in answer:
                answer[disk] = []
            answer[disk].append(i)

    return answer

def findClusters(preprocessedData, clusters, diskNum):
    answer = []
    for clusterid in preprocessedData[diskNum]:
        answer.append(clusters[clusterid])
    return answer

预处理需要线性时间,而实际搜索需要恒定时间(以查找相关聚类)和线性时间(按找到的聚类数量的顺序)来创建相关聚类列表

答案 1 :(得分:1)

例如,如果您要搜索磁盘10,则可以执行以下操作:

>>> [cluster for cluster in Listofclusters if 10 in cluster['Disks']]
... [{'Disks': [10, 11, 12], 'right': True, 'left': True}]

答案 2 :(得分:1)

根据您的要求:

  

在列表中搜索特定磁盘,并希望它告诉我   列表中的哪些群集具有这些磁盘

使用以下方法形成一个词典cluster_numbers,其中的键是 磁盘号 ,值是 群集的列表名称(集群订单号)
让我们找到所有群集名称(数字),其中包含以下列表中的一个或多个磁盘编号[2, 10, 7]

search_disks = [2, 10, 7]
cluster_numbers = {d:[] for d in search_disks}

for d in cluster_numbers.keys():
    for k, c in enumerate(Listofclusters):
        if d in c['Disks']: cluster_numbers[d].extend(['cluster' + str(k+1)])

print(cluster_numbers)

输出:

{2: ['cluster1', 'cluster2', 'cluster3'], 10: ['cluster4'], 7: ['cluster3']}