Python Multidimensionales Dict / Liste erzeugen mit unbekannten Key/Value

Blackbenji

Lieutenant
Registriert
Nov. 2009
Beiträge
557
Hallo zusammen,

ich habe mir ein Script geschrieben welches via Threading aus 300 URLs Werte zusammen sucht.
Das Funktioniert auch.

Nun möchte ich diese Werte in ein DICT oder List packen um diese Weiter zu verarbeiten.
Die Generierung soll daher automatisch laufen wo, je nach (fehlerhafter) Abfrage Werte gespeichert werden.

Code:
{
	"live": {
		"cluster1": {
			"clone": {
				"0": {
					"status": "down",
					"version": "0.9",
				},
				"1": {
					"status": "down",
					"version": "0.9",
				},				
			}
		},
		"cluster2": {
			"clone": {
				"0": {
					"status": "down",
					"version": "1.1",
				},
				"1": {
					"status": "down",
					"version": "1.0",
				},				
			}
		}		
	}
}

Nur stelle ich mich gerade sehr kompliziert an hier das DICT oder eine LIST zu erstellen die keine Fehler ausspuckt.
Hat jemand für mich vielleicht einen Ansatz?


Die Aufteilung sollte nach Möglichkeit so bleiben, da ich danach noch weiter Filtern möchte.

Danke und Gruß,
Benji
 
Wie meinst du das: "mit unbekannten Key/Value"?

Ohne Code wird das schwierig da was zu sagen. Du hast also mehrere Threads, die dir insgesamt deine 300 URLs ausspucken?

Und wenn ich dich richtig verstanden habe, möchtest du jetzt die URLs (scheinbar geparst, jedenfalls siehts in deinem Post so aus) in ein gemeinsames dict packen?
 
also von den threads kommt zurück:
- environment (es gibt 5, aber nicht jede wird jedes mal benötigt)
- application (pro environment sind diese identisch, aber wie auch die environment nicht immer benötigt)
- clone (pro application max 6, aber auch hier nicht immer benötigt)
- dann noch der status und die versionsnummer je clone.

Hintergrund ist: ich möchte eine liste haben an applikationen die in diversen Umgebungen defekt sind oder Abweichungen haben.
applikationen die "up" sind, interessieren hier also nicht mehr.

daher "unbekannte key/value" da diese immer variieren können.
 
Wie wäre es mit einem Sample..wie es aussehen soll. Spruch ein theo. Ablauf.

Ich glaub schon verstanden zu haben was du willst- würde aber gerne nochmal nach haken.
 
Was ich mir in etwas vorstelle ist so etwas:

Code:
#!/usr/bin/env python
# coding=utf-8

global_status = {}


def collect_status(env, app, clone, status, version):
    global_status[env] = {}
    global_status[env][app] = {"clone": clone, "status": status, "version": version}
    return global_status

collect_status("live", "app1", "0", "down", "1.11")
print global_status

Die Ausgabe ist dann:
Code:
{'live': {'app1': {'status': 'down', 'clone': '0', 'version': '1.11'}}}

Für die Weiterverarbeitung kann ich dann schön per:
Code:
global_status.keys()
drauf zugreifen.

Mein Problem ist nun aber das hier nicht 1x sondern 300 mal die Funktion aufgerufen wird.

Code:
collect_status("live", "app1", "1", "down", "1.11")
collect_status("live", "app1", "2", "down", "1.12")
collect_status("live", "app2", "1", "down", "1.3")
....
print global_status

Die Ausgabe zeigt dann nur den letzten Wert:
Code:
{'live': {'app2': {'status': 'down', 'clone': '1', 'version': '1.3'}}}
Ergänzung ()

bin inzwischen ein Schritt weiter:

Code:
arr = {}


def add(k, v):
    if not arr:
        arr.setdefault(k, [])
        arr[k].append(v)
    else:
        for key in arr.keys():
            if key is k:
                arr[k].append(v)
            else:
                arr.setdefault(k, [])
                arr[k].append(v)


add('live', {'app': 'app1', 'clone': '0', 'status': 'down', 'version': '1.35'})
add('live', {'app': 'app1', 'clone': '1', 'status': 'down', 'version': '1.35'})
add('live', {'app': 'app2', 'clone': '0', 'status': 'down', 'version': '1.35'})
add('live', {'app': 'app2', 'clone': '1', 'status': 'down', 'version': '1.35'})

add('prelive', {'app': 'app1', 'clone': '0', 'status': 'down', 'version': '1.35'})
add('prelive', {'app': 'app1', 'clone': '1', 'status': 'down', 'version': '1.35'})
add('prelive', {'app': 'app2', 'clone': '0', 'status': 'down', 'version': '1.35'})
add('prelive', {'app': 'app2', 'clone': '1', 'status': 'down', 'version': '1.35'})

add('tui', {'app': 'app1', 'clone': '0', 'status': 'down', 'version': '1.35'})
add('tui', {'app': 'app1', 'clone': '1', 'status': 'down', 'version': '1.35'})
add('tui', {'app': 'app2', 'clone': '0', 'status': 'down', 'version': '1.35'})
add('tui', {'app': 'app2', 'clone': '1', 'status': 'down', 'version': '1.35'})


"arr" sieht nun aus:
Code:
{'tui': [{'status': 'down', 'app': 'app1', 'version': '1.35', 'clone': '0'}, {'status': 'down', 'app': 'app1', 'version': '1.35', 'clone': '0'}, {'status': 'down', 'app': 'app1', 'version': '1.35', 'clone': '1'}, {'status': 'down', 'app': 'app1', 'version': '1.35', 'clone': '1'}, {'status': 'down', 'app': 'app1', 'version': '1.35', 'clone': '1'}, {'status': 'down', 'app': 'app2', 'version': '1.35', 'clone': '0'}, {'status': 'down', 'app': 'app2', 'version': '1.35', 'clone': '0'}, {'status': 'down', 'app': 'app2', 'version': '1.35', 'clone': '0'}, {'status': 'down', 'app': 'app2', 'version': '1.35', 'clone': '1'}, {'status': 'down', 'app': 'app2', 'version': '1.35', 'clone': '1'}, {'status': 'down', 'app': 'app2', 'version': '1.35', 'clone': '1'}], 'live': [{'status': 'down', 'app': 'app1', 'version': '1.35', 'clone': '0'}, {'status': 'down', 'app': 'app1', 'version': '1.35', 'clone': '1'}, {'status': 'down', 'app': 'app2', 'version': '1.35', 'clone': '0'}, {'status': 'down', 'app': 'app2', 'version': '1.35', 'clone': '1'}], 'prelive': [{'status': 'down', 'app': 'app1', 'version': '1.35', 'clone': '0'}, {'status': 'down', 'app': 'app1', 'version': '1.35', 'clone': '1'}, {'status': 'down', 'app': 'app1', 'version': '1.35', 'clone': '1'}, {'status': 'down', 'app': 'app2', 'version': '1.35', 'clone': '0'}, {'status': 'down', 'app': 'app2', 'version': '1.35', 'clone': '0'}, {'status': 'down', 'app': 'app2', 'version': '1.35', 'clone': '1'}, {'status': 'down', 'app': 'app2', 'version': '1.35', 'clone': '1'}]}

Was mir nicht gefällt ist meine Ausgabe:
Code:
for i in sorted(arr.keys()):
    print i
    for data in arr[i]:
        print "\t" + i + " " + data.get('app')

Code:
live
	live app1
	live app1
	live app2
	live app2
prelive
	prelive app1
	prelive app1
	prelive app1
	prelive app2
	prelive app2
	prelive app2
	prelive app2
tui
	tui app1
	tui app1
	tui app1
	tui app1
	tui app1
	tui app2
	tui app2
	tui app2
	tui app2
	tui app2
	tui app2

Warum addieren sich die Werte?
Eigentlich wollte ich nur für jede Umgebung die Einträge?
Ergänzung ()

Ok, der Fehler lag im "add"

Code:
def add(k, v):
    if not arr:
        arr.setdefault(k, [])
    else:
        for key in arr.keys():
            if key is not k:
                arr.setdefault(k, [])
    arr[k].append(v)

Problem ist behoben!
 
Zuletzt bearbeitet:
Zurück
Oben