2010-08-02 5 views
0
drug_input=['MORPHINE','CODEINE']  
def some_function(drug_input)  
     generic_drugs_mapping={'MORPHINE':0, 
           'something':1, 
           'OXYCODONE':2, 
           'OXYMORPHONE':3, 
           'METHADONE':4, 
           'BUPRENORPHINE':5, 
           'HYDROMORPHONE':6, 
           'CODEINE':7, 
           'HYDROCODONE':8} 

row est une liste.python: suppression des valeurs d'une liste

Je voudrais mettre tous les membres de row[..]='' SAUF pour ceux qui drug_input définit, dans ce cas, il est 0 et 7.

Alors row[1,2,3,4,5,6,8]=''

Si row est d'abord:

row[0]='blah' 
row[1]='bla1' 
... 
... 
row[8]='bla8' 

J'ai besoin:

row[0]='blah' (same as before) 
row[1]='' 
row[2]='' 
row[3]='' 
... 
... 
row[7]='bla7' 
row[8]='' 

Comment est-ce que je fais ceci?

+1

N'utilisez pas de liste. Utilise un dictionnaire. –

+1

Je ne suis pas sûr de ce que vous demandez. Quelle devrait être la valeur totale de 'row' à la fin, précisément? Quelles devraient être les valeurs qui ne sont pas des chaînes vides? –

+0

Vous êtes presque certainement le faire mal. Sparse est mieux que dense. –

Répondre

2

Vous pouvez d'abord créer un ensemble de tous les indices qui doivent être conservés, puis définissez tous les autres à '':

keep = set(generic_drugs_mapping[drug] for drug in drug_input) 
for i in range(len(row)): 
    if i not in keep: 
    row[i] = '' 
+0

merci beaucoup !! qu'est-ce que la gamme fait ?? –

+1

@I__: 'range' est une fonction de bibliothèque standard qui retourne une liste de nombres, de 0 à celle donnée en paramètre (exclusif). Comme 'range (5)' == '[0,1,2,3,4]'. Voir http://docs.python.org/library/functions.html#range – sth

+0

Si 'len (row)' est grand, j'utiliserais 'xrange' au lieu de' range'; il fonctionne de la même manière dans une boucle for mais évite de construire la liste en mémoire. –

2

je l'avais mis en place un defaultdict à moins que vous vraiment besoin d'être une liste:

from collections import defaultdict # put this at the top of the file 

class EmptyStringDict(defaultdict): 
    __missing__ = lambda self, key: '' 

newrow = EmptyStringDict() 
for drug in drug_input: 
    keep = generic_drugs_mapping[drug]  
    newrow[keep] = row[keep] 
saved_len = len(row) # use this later if you need the old row length 
row = newrow 

Avoir une liste qui est surtout des chaînes vides est inutile. Cela va générer un objet qui renvoie '' pour toutes les valeurs sauf celles réellement insérées. Toutefois, vous devez modifier le code d'itération pour utiliser xrange(saved_len). Idéalement, cependant, vous devez simplement modifier le code qui utilise la liste afin de ne pas avoir besoin d'une telle chose.

Si vous voulez vraiment construire la liste:

newrow = [''] * len(row) # build a list of empty strings 
for drug in drug_input: 
    keep = generic_drugs_mapping[drug]  
    newrow[keep] = row[keep] # fill it in where we need to 
row = newrow # throw the rest away 
+0

désolé, mis à jour ma question, il n'était pas si clair avant –

+0

Bon, j'ai mis à jour ma réponse pour répondre à votre question mieux maintenant. –

Questions connexes