2012-03-29 6 views
0

ich eine CSS-Datei dieses Typs ersten Spalte haben basierend auf Einbuchtungwenn ich versuche Wert in dict anhängen seine Schlüsselfehler zeigt

col1 col2 
AAA  
a  1 
    a1  1 
    a2  1 
b  1 
    b1  1 
    b2  1 

Ich lese, „AAA“ hat 0 keine Leerzeichen, "ein " "b" hat 1 Leerzeichen und "a1"," a2" "b1" "b2" hat 2 Raum, jetzt bin ich Druck dict als

d={'a':['a1','a2'],'b':['b1','b2']} 

Aber was ich will, ist

d={'AAA':['a','b'],'a':['a1','a2'],'b':['b1','b2']} 

Ich benutze Code wie diese

reader=csv.DictReader(open("c:/Users/Darshan/Desktop/sss.csv"),dialect="excel") 
for row in reader: 
    a.append(row['col1']) 
    for i in range(len(a)): 
     if a[i].count(' ')==1: 
      d[a[i]]=[] 
      k=a[i] 

     else a[i].count(' ')==2: 
      d[k].append(a[i]) 

Ausdrucken Ausgabe

d={'a':['a1','a2'],'b':['b1','b2']} 

so jemand mir, Dank im Voraus

+0

Sie haben eine Antwort, die geholfen hat - Sie sollten es akzeptieren. –

+0

@EthanFurman yest selbst ich akzeptierte, was ist das, – user1182090

Antwort

3

Was passiert, wenn Sie nur für Ihre ändern Schleife dabei helfen können:

# A variable to keep track of the least-nested level of your hierarchy 
top_lvl = '' 
k = '' 
for i in range(len(a)): 
    # Pre-compute this value so you don't have to do it twice or more 
    c = a[i].count(' ') 
    # This case is the topmost level 
    if c == 0: 
     top_lvl = a[i] 
     d[top_lvl] = [] 
    # This case is the middle level 
    elif c == 1: 
     d[a[i]]=[] 
     k=a[i] 
     d[top_lvl].append(k) 
    # This case is the most deeply nested level 
    else: # c==2 
     d[k].append(a[i]) 

In der Tat, jetzt, wo ich alles süß mache, können Sie wahrscheinlich nur die Werte indurchlaufendirekt, ohne auf seine Werte per Index Bezug zu nehmen. Wie so:

# A variable to keep track of the least-nested level of your hierarchy 
top_lvl = '' 
# More descriptive variable names can make everything easier to read/understand 
mid_lvl = '' 
for val in a: 
    # Pre-compute this value so you don't have to do it twice or more 
    c = val.count(' ') 
    # This case is the topmost level 
    if c == 0: 
     top_lvl = val 
     d[val] = [] 
    # This case is the middle level 
    elif c == 1: 
     d[val]=[] 
     mid_lvl =val 
     d[top_lvl].append(mid_lvl) 
    # This case is the most deeply nested level 
    else: # c==2 
     d[mid_lvl].append(val) 
+0

Vielen Dank, Sie haben das Problem gelöst – user1182090

+0

Danke, Sie können upvote, wenn Sie wollen; Siehe auch mein zweites Beispiel. Es ist viel sauberer und lesbarer IMO. BTW das ist nicht Perl, Sie müssen nicht 1-Buchstaben-Variablennamen verwenden :) –

+0

+1 Wow, was für eine Menge Arbeit in so ein hässliches Problem. ;) –

Verwandte Themen