2017-09-17 8 views
0

J'ai beaucoup de formulaire de données que je veux faire passer des points flottants dans une autre fonction. Pour ce faire, j'ai créé une fonction Lsym (s, n, N = '11a') qui fait le travail pour moi en partie. Je veux accéder aux points flottant sur la droite des données ci-dessousAccéder à une partie des données à l'aide d'une fonction?

Lsym['11a'][1][2]=1.057599244591 
Lsym['11a'][2][2]=1.127354242069 
Lsym['11a'][3][2]=1.090644807038 
Lsym['11a'][4][2]=1.052410518255 
Lsym['11a'][5][2]=1.02815187087 
Lsym['11a'][2][4]=0.8209366139554 
Lsym['11a'][3][4]=0.8949278089063 
Lsym['11a'][4][4]=0.9429984866328 
Lsym['11a'][5][4]=0.970256549013 
Lsym['11a'][3][6]=0.8929614099822 
Lsym['11a'][4][6]=0.9434221639356 
Lsym['11a'][5][6]=0.970721596782 
Lsym['11a'][4][8]=1.053427474878 
Lsym['11a'][5][8]=1.02816330898  
Lsym['11a'][5][10]=1.03597753138 
..... 

Le code que je l'ai écrit est

def Lsym(s,n,N = '11a'): 
    f = open("path",'r') 
    for item in f: 
     if item.split('=')[0][6:-8] == N: 
      if s == int(item.split('=')[0][-5]): 
       if n == int(item.split('=')[0][-2]): 
        id1 = float(item.split('=')[1][:-1]) 
       if n == int(item.split('=')[0][15:17]): 
        id1 = float(item.split('=')[1][:-1]) 
    return id1 

La sortie de c'est

sage: Lsym(1,2) 
sage: 1.057599244591 
sage: Lsym(3,6) 
sage: 0.8929614099822 

Cependant quand j'appelle

sage: Lsym(5,10) 
ValueError: invalid literal for int() with base 10: '2]' 

Comment résoudre ce problème? Ou y a-t-il un meilleur moyen d'accéder à ces valeurs flottantes? En particulier, comment puis-je accéder à

Lsym(5,10)? 

Merci pour le temps et l'aide.

+0

Probablement parce qu'il est deux chiffres –

+0

Oui, c'est pourquoi j'ai une autre affaire pour si n == int (item.split ('=') [0] [15:17]): mais il ne marche pas toujours travail. – Kumarm

Répondre

1

Voici une solution qui fonctionne aussi avec des nombres supérieurs à 9 pour s et n.

def Lsym(s,n,N = '11a'): 
    with open("path",'r') as f: 
     for item in f: 
      [head,number] = item.split("=") 
      [_, first,second,third] = head.replace('[',' ').replace(']',' ').split() 
      if first.strip('\'') == N and int(second) == s and int(third) == n: 
       return number.strip() 
+0

Merci .. Cette solution fonctionne également ... – Kumarm

1

Le problème que vous avez est que vous utilisez l'indexation positionnelle dans une chaîne. Alors, quand vous allez à deux chiffres (« 10 »), votre sélection va mal

Une solution rapide pour diviser à nouveau sur « [ »

def Lsym(s,n,N = '11a'): 
    f = open("path",'r') 
    for item in f: 
     if item.split('=')[0].split('[')[1][1:-2] == N: 
      if s == int(item.split('=')[0].split('[')[2][:-1]): 
       if n == int(item.split('=')[0].split('[')[3][:-1]): 
        id1 = float(item.split('=')[1][:-1]) 
    return id1