2016-06-01 8 views
1

Ich habe ein großes Wörterbuch:in einem Wörterbuch

exp_dict={0: {'length': 38.63999999999999, 

    'line_nm': [['Hammersmith & City_1'], 

    ['Hammersmith & City_1'], 

    ['Hammersmith & City_1'], 

    ['Metropolitan_1', 'Hammersmith & City_1'], 

    ['Metropolitan_1', 'Hammersmith & City_1'], 

    ['Metropolitan_1', 'Hammersmith & City_1'], 

    ['Metropolitan_1', 'Hammersmith & City_1'], 

    ['Metropolitan_1', 'Hammersmith & City_1'], 

    ['Metropolitan_1', 'Hammersmith & City_1'], 

    ['Metropolitan_1', 'Hammersmith & City_1'], 

    ['Metropolitan_1'], 

    ['Metropolitan_1'], 

    ['Metropolitan_1'], 

    ['Metropolitan_1', 'Hammersmith & City_1'], 

    ['Metropolitan_1', 'Hammersmith & City_1'], 

    ['Hammersmith & City_1'], 

    ['Hammersmith & City_1'], 

    ['Central', 'Hammersmith & City_1'], 

    ['Central']]}, 
1:{'length':100, 
    'line_nm':[ 
      ['Bakerloo'], 
      ['Bakerloo'], 
      ['Central'], 
      ['Central'], 
      ['Central'], 
      ['Northern'], 
      ['Northern'], 
      ['Northern'] 

     ] 

    }} 

Ich möchte den Wert ändern, um herauszufinden, (Kreuzung) in jedem ‚line_nm‘ Teil und ihrem Index.

Zum Beispiel würde Ich mag für dict['1'] wissen:

bei

dict['1']['line_nm'][10] 

die line_nm geändert

['Metropolitan_1'] 

, die mit

keine Kreuzung hat
dict['1']['line_nm'][0] 

und bei

dict['1']['line_nm'][15] 

die line_nm ist ['Metropolitan_1'] die keine Kreuzung 10.

Ich muss wissen alle Index

Zur Zeit hat, kann ich nur mit vorheriger ['Metropolitan_1'] in Index sehen, ob es eine Änderung ist von:

for key,value in dict.items(): 
    if set(value['line_nm'][0]).intersection(*value['line_nm'])==set([]): 
     print key,True 
+0

I habe Probleme, genau zu verstehen, was du zu tun versuchst. Möchten Sie die Schnittmenge der Elemente in Ihren verschachtelten Listen vergleichen? Sind Sie nur mit dem Schnittpunkt von Index 5 mit Index 0 und Index 10 mit Index 5 für jedes Ihrer verschachtelten Wörterbücher beschäftigt? – Daniel

+0

Ich möchte jedes Element in der Liste vergleichen, das erste finden (sagen wir Index = a), nicht den Schnittpunkt mit der Liste [0], dann das nächste nicht mit der Liste finden [index = a]. –

Antwort

1

Hier sind einige Gedanken:

  • Verwenden Sie nicht dict als Variablenname, da es bereits als Built-in existiert. Verwenden Sie dict_ (oder einen anderen Namen insgesamt)
  • Es ist besser Python-Stil Räume um Operatoren zu enthalten wie „==“ und „=“ (eine große Ressource: PEP-8)
  • Sie wahrscheinlich von any() für Ihren Anwendungsfall profitieren würden

der folgende Code gierig iteriert durch die verschachtelten Listen in der Datenstruktur und gibt einen Wörterbuch d, wo die Schlüssel von d die Tasten Ihres dict und die Werte von d sind Listen von Tupeln. Die Tupel enthalten den Index des Listenwerts in Ihren geschachtelten Listen und den Listenwert selbst basierend auf den in Ihrer Frage angegebenen Parametern.

d = {} 

for k,v in dict_.items(): 
    d[k] = [] 
    ind = v['line_nm'][0] 
    for i, j in enumerate(v['line_nm']): 
     if not any(x in j for x in ind):    
      d[k].append((i, v['line_nm'][i])) 
      ind = v['line_nm'][i] 

print d 

# output: 
# {0: [(10, ['Metropolitan_1'])], 
# 1: [(5, ['Metropolitan_1']), (10, ['Central', 'Hammersmith & City_1'])]} 

EDIT

Der obige Code liefert dieser Ausgang für exp_dict:

# output: 
# {0: [(10, ['Metropolitan_1']), 
#  (15, ['Hammersmith & City_1']), 
#  (18, ['Central'])], 
# 1: [(2, ['Central']), 
#  (5, ['Northern'])]} 

Wenn Sie nur die relevanten Indizes wollen, dann diesen Code verwenden:

d = {} 

for k,v in exp_dict.items(): 
    d[k] = [] 
    ind = v['line_nm'][0] 
    for i, j in enumerate(v['line_nm']): 
     if not any(x in j for x in ind): 
      d[k].append(i) 
      ind = v['line_nm'][i] 

print d 

# which outputs the following for exp_dict: 
# {0: [10, 15, 18], 
# 1: [2, 5]} 
+0

Danke, würdest du bitte meinen Beitrag wieder besuchen? Ich habe einige Änderungen vorgenommen, so dass Ihr Code möglicherweise nicht gut funktioniert (er vermisst die 15, die dieselbe Zeile mit der [0], aber nicht mit der gleichen [15] hat). Der springende Punkt ist, wenn Sie die Liste ['line_nm'] durchlaufen, müssen Sie zu einem neuen Namen wechseln, ich möchte den Index des Änderungspunkts herausfinden. –

+0

Mein Vergnügen; Danke für deine Änderungen - Ich habe meine Antwort bearbeitet, einschließlich der Ausgabe basierend auf deinem neuen 'exp_dict'. Ich freue mich, Ihnen weiterhelfen zu können. – Daniel

+0

Vielen Dank für Ihre Hilfe ~ Können Sie den 'ind' Teil im Code erklären? Wie funktioniert es? Und wenn irgendeine neue Änderung erscheint (gleiches mit einem der alten Namen vorher), wird das funktionieren? Sorry für so viele Fragen. –