2016-12-20 4 views
2

Ich habe ein Python-Objekt, das ein Diktat der Schlüssel ist Hostnamen und Werte eine Liste von Benutzern und ihre Festplattennutzung in der Notation von Dicts. Ich habe mein Diktat unten eingefügt, da die Erklärung verwirrend scheint. Jeder Host ist ein Schlüssel und unter jedem Host kann es mehrere Benutzer geben, die in den Hosts üblich sind und die auch einzigartig sein können. Ich habe Mühe, die folgenden Bedingungen zu überprüfen.Erstellen Sie ein Diktat von dict von Listen in Python

  1. Überprüfen Sie, ob dieser Benutzer in jedem Host vorhanden ist.
  2. Wenn ja, fügen Sie die gesamte Festplatte hinzu, die er in jedem Host verwendet.
  3. Wenn nicht, fügen Sie den eindeutigen Benutzer dem Diktat hinzu.
  4. Jetzt im großen Diktat sortieren die Benutzer in der Reihenfolge ihrer Festplattennutzung.

bisher erreicht: mit Host-Namen als Schlüssel und Werte 1. Melden Sie sich bei jedem der Hosts 2. Benutzer und deren Plattennutzung Get 3. Ergebnis in einem dict gespeichert ist, eine Liste von Benutzern und ihre Festplattennutzung.

Wenn ich dies ein Diktat des Diktats machen kann, hoffe ich, dass mein Problem gelöst ist.

{ 
'localhost': [ 
    'alice: 1491916K', 
    'bob: 423576K' 
], 
'10.252.136.241': [ 
    'alice: 3491916K', 
    'bob: 4235K', 
    'chaplin: 3456K' 
] 
} 

Dies ist eine Beispielausgabe von 2 Hosts. Jetzt habe ich das Ergebnisobjekt, das ein Diktat in der obigen Form ist. Ich möchte zu jedem der Hosts iterieren, sehen, ob der Benutzer "Alice" in jedem Host vorhanden ist und seinen Speicherplatz hinzufügen und einen einzigen Eintrag im Diktat für "Alice" und den gleichen für "Bob" und dann verlassen Chaplin Wie im neuen Diktat. Ich möchte nicht hostspezifisch. Ich möchte am Ende eine Gesamtnutzung.

Ich bin nur beim Iterieren stecken. Ich kann es schaffen, das große Diktat von "Benutzer" zusammenzufassen und zu erstellen: "total_space", sobald ich iterieren kann.

[UPDATE] Meine erwartete Ausgabe ist

expected_output = { 'alice': '498382K', 'bob': '427811K', 'chaplin': '3456K' } 

hier. Die Verwendung von Alice wird in jedem der Hosts hinzugefügt. dasselbe für Bob und Chaplin ist nur angehängt, weil er nicht in allen Hosts anwesend ist.

+1

Bitte zeigen Sie ein Beispiel Ihrer benötigten Ausgabe. –

+0

@DanielRoseman Meine erwartete Ausgabe im Update der Frage hinzugefügt. Thx – Medhamsh

+0

Nun, Iterieren ist hier nicht mehr das Schwierigste; Jetzt scheinen Sie auch die Werte auf ganze Zahlen zu analysieren und sie zu summieren. –

Antwort

1
given_dict = { 
    'localhost': ['alice: 1491916K', 'bob: 423576K'], 
    '10.252.136.241': ['alice: 3491916K', 'bob: 4235K', 'chaplin: 3456K'] 
} 
resultant_dict = {} 

for values in given_dict.values(): 
    for value in values: 
     name, usage = value.split(':') 
     usage = int(usage.strip().rstrip('K')) 
     if name in resultant_dict: 
      resultant_dict[name] += usage 
     else: 
      resultant_dict[name] = usage 

sorted_result = sorted(resultant_dict.items(), key=lambda x: x[1]) 
for name, usage in sorted_result: 
    print("{}: {}".format(name, usage)) 

würden Sie diese Ausgabe

chaplin: 3456 
bob: 427811 
alice: 4983832 

Wenn Sie schauen, um das Ergebnis in der absteigenden Reihenfolge der Festplattennutzung zu sortieren, setzten reverse=True für die sorted Funktion.

0

Hint

Dies ist naive Implementierung für Algorithmus, der list um dict das Format erwartet macht Sie gezeigt haben.

In [21]: def dictify(l): 
    ...:  d = dict() 
    ...:  for x in l: 
    ...:   key, val = [y.strip() for y in x.split(':')] 
    ...:   d[key] = val 
    ...:  return d 
In [22]: dictify(data['localhost']) 
Out[22]: {'alice': '1491916K', 'bob': '423576K'} 
+0

Vielen Dank dafür. Ich mache immer noch kein Listenverständnis, um eine Liste aller Diktate zu erstellen, und die Idee ist, Sammlungen weiter zu verwenden. Zähle und summiere die Werte der entsprechenden Schlüssel in allen Diktaten und mache ein einziges Diktat. – Medhamsh

1

Für diese Aufgabe Sie Kombination von Tools wie regex und itertools.groupby verwenden können:

values = { 
'localhost': [ 
    'alice: 1491916K', 
    'bob: 423576K' 
], 
'10.252.136.241': [ 
    'alice: 3491916K', 
    'bob: 4235K', 
    'chaplin: 3456K' 
] 
} 
import re 
import itertools 

numbers = re.compile(r'\d+') 

parsed_list = [(el.split(': ')[0], int(numbers.findall(el)[0])) for k, v in values.items() for el in v] 

print({k: sum([el[1] for el in v]) for k, v in itertools.groupby(sorted(parsed_list), key=lambda x: x[0])}) 

Ausgang:

{'alice': 4983832, 'bob': 427811, 'chaplin': 3456} 
0

Sie können wie folgt tun:

import re 

dic = { 
    'localhost': [ 
     'alice: 1491916K', 
     'bob: 423576K' 
    ], 
    '10.252.136.241': [ 
     'alice: 3491916K', 
     'bob: 4235K', 
     'chaplin: 3456K' 
    ], 
} 

users = {} 
# down we are unpacking all the names/vals of (['alice', ' 3491916K'], ['bob', ' 4235K'], ['chaplin', ' 3456K'], ['alice', ' 1491916K'], ['bob', ' 423576K']) 
for name, val in (j.split(':') for x in dic.values() for j in x): 
    users[name] = users.get(name, 0) + int(re.findall('\d+', val)[0]) 

print(users) # {'chaplin': 3456, 'alice': 4983832, 'bob': 427811} 
sort_users = sorted(users.items(), key=lambda x: x[1], reverse=True) 
print(sort_users) # [('alice', 4983832), ('bob', 427811), ('chaplin', 3456)] 
0
data={ 
'localhost': [ 
    'alice: 1491916K', 
    'bob: 423576K' 
], 
'10.252.136.241': [ 
    'alice: 3491916K', 
    'bob: 4235K', 
    'chaplin: 3456K' 
] 
} 

res=[] 
k=data.values() 
for elm in k: 
    res1={} 
    for x in elm: 
     res1[(x.split(':'))[0]]=x.split(':')[1] 
    res.append(res1) 

print dict(zip(data.keys(), res)) 

Ausgang:

{'10.252.136.241': {'chaplin': ' 3456K', 'bob': ' 4235K', 'alice': ' 3491916K'}, 'localhost': {'bob': ' 423576K', 'alice': ' 1491916K'}} 
Verwandte Themen