2010-08-02 86 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是一個列表。python:擺脫列表中的值

我想設置的row[..]=''所有成員,除了那些drug_input定義,在這種情況下,它是0和7

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

如果row最初是:

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

我需要:

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

我該怎麼做?

+1

請勿使用列表。使用字典。 – 2010-08-02 22:21:45

+1

我不確定你在問什麼。 「行」的全部價值到底應該是什麼?什麼值不是空字符串? – 2010-08-02 22:23:15

+0

你幾乎肯定是做錯了。稀疏比密集好。 – 2010-08-02 22:24:26

回答

2

你可以先創建一個組應保持所有索引,然後所有其他的人設置爲''

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

非常感謝你!範圍是什麼? – 2010-08-02 22:34:00

+1

@I__:'range'是一個標準的庫函數,它返回一個數字列表,從0到給定的參數(獨佔)。像'range(5)'=='[0,1,2,3,4]'。見http://docs.python.org/library/functions.html#range – sth 2010-08-02 22:42:34

+0

如果'len(row)'很大,我會使用'xrange'而不是'range';它在for循環中的作用相同,但是避免了在內存中實際構建列表。 – 2010-08-03 03:00:23

2

我會成立了一個defaultdict除非你真的需要這是一個列表:

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 

有一個列表這主要是空字符串是一種浪費。這將生成一個對象,除了實際插入的值以外,每個值都會返回''。但是,您需要更改任何迭代代碼以使用xrange(saved_len)。但理想情況下,您只需修改使用該列表的代碼,以免需要這樣的事情。

如果你真的想建立名單:

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

對不起,更新了我的問題,在 – 2010-08-02 22:28:01

+0

之前沒有這麼清楚好吧,我已經更新了我的回答,現在可以更好地回答你的問題。 – 2010-08-03 03:11:42