2016-11-13 2 views
1

lassen Sie uns Eingabe sagen, dass wir ein paar Cluster als Wörterbücher unten dargestellt haben:das Wörterbuch in einer Liste lokalisieren, wenn ein bestimmter Wert

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] 

Dann mache ich eine Liste der Cluster wie oben um sie zu speichern ... .

Wenn ich die Liste nach einer bestimmten Festplatte durchsuchen möchte und mir sagen möchte, welche Cluster in der Liste diese Festplatten haben, wie würde ich das tun?

+0

Sie könnten eine '_id' Feld für jeden der Cluster zuordnen, wenn Sie es identifizieren möchten. Andernfalls können Sie den Cluster einfach zurückgeben, ohne ihn unbedingt zu identifizieren. – erip

Antwort

1

Entsprechend Ihrer Anforderung:

die Liste für eine bestimmte Festplatte suchen und würde es mir zu sagen, wie die Cluster in der Liste

Verwenden Sie die folgende Vorgehensweise, diese Scheiben haben, die eine dict bilden cluster_numbers die Schlüssel ist ein Plattennummer und Wert ist eine Liste der Clusternamen (Cluster Bestellnummern)
der alle Cluster-Namen finden lassen (Zahlen), die eine oder mehrere Plattennummern fr haben om In der folgenden Liste [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) 

Der Ausgang:

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

schön es funktioniert besser als ich hätte erhoffen können und macht genau das, was ich wollte! –

+0

@DavidAbraham, willkommen, froh zu helfen – RomanPerekhrest

+0

wäre es möglich zu erklären, wie dieses bestimmte Stück Code funktioniert? –

2

Basierend auf den Daten, die Sie haben, sollten diese es tun:

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

Nun, das ist ein linearer Algorithmus. Mit einem wenig Vorverarbeitung, sollten Sie in der Lage sein, die Laufzeit wesentlich zu verbessern:

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 

Die Vorverarbeitung erfolgt die lineare Zeit, während die eigentliche Suche benötigt konstante Zeit (um die relevanten Cluster zu finden) und die lineare Zeit (in der Größenordnung von die Anzahl der Cluster gefunden) die Liste der relevanten Cluster

+0

'def findClusters (n, Cluster): return [Cluster für Cluster in Clustern, wenn n im Cluster ['Disks']]' könnte ein bisschen schneller sein. :) müsste allerdings benchmarken. Gute Antwort. – erip

+0

Hut wäre nicht unbedingt schneller - es ist nur schwerer zu lesen, da das OP die Logik verstehen muss. – jsbueno

+0

@erip: Ich arbeite tatsächlich an einer viel schnelleren Lösung mit etwas Vorverarbeitung. Bereithalten! – inspectorG4dget

1

Wenn Sie zum Beispiel erstellen, können Sie für Datenträger suchen möchten 10 Sie folgendes tun:

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