2010-08-02 55 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