2016-01-13 45 views
1

我不是很习惯pyhton和想写一个函数,它的阵列x作为输入,并给出一个数组背面(select)仅由的那些条目的输入数组,满足一定的属性,例如在一定范围内。应该做到这一点的功能如下:选择数组元素定义一个新的数组

def select(x): 
    count = 0 
    select = []    #0 
    for i in range(0,len(x[0])): 
     if ((int(x[4][i])+0.5) > x[4][i] > (int(x[4][i])-0.5) ): 
     select[0][count]=x[0][i] #1 
     select[1][count]=x[1][i] #2 
     select[2][count]=x[4][i] #3 
     count = count + 1 
    return select 

但是,如果我调用该函数,我得到了以下错误消息:

IndexError: list index out of range 

线使其为“#1”(和以下2条线也在制造麻烦,我认为)。我想我必须以某种方式定义数组大小。在那种情况下,我怎么能在python中做到这一点?正如我所看到的select=[]是不够的。

亲切的问候

+0

这个问题(我认为你意识到)是select没有[0]元素。你能告诉你期望输入'x'和输出'select'是否适合某些情况? – Brian

回答

1

select是一个空表开始。您正在尝试将值分配给其当前不存在的元素。

也许你需要select = [[], [], []]

而且select的内部元素的元素,当你试图给它们分配在#1不会也存在,#2,#3

也许这就是你想要的:

def select(x): 
    select = [[] for i in range(3)] #0 : [[], [], []] 
    for i in range(0,len(x[0])): 
     if ((int(x[4][i])+0.5) > x[4][i] > (int(x[4][i])-0.5) ): 
     select[0].append(x[0][i]) #1 
     select[1].append(x[1][i]) #2 
     select[2].append(x[4][i]) #3 
    return select 
+0

也许,但似乎是一个奇怪的选择填补它。我认为'select = range(3)'是更为pythonic的方式。 – Brian

+0

他想在'select'中嵌入一些东西,所以需要一个字典或另一个列表,而不是范围。 – jatinderjit

+0

完全,gotcha,呃! – Brian

1

作为替代自己的过滤方法(以实现阵列过滤WRT的范围),则可以使用下面的方法

myRange = [8, 11] 
myArr = [6, 7, 8, 9, 10, 11, 12] 
myArrFiltered = [x for x in myArr if myRange[0] <= x <= myRange[1]] 
print(myArrFiltered) 
# [8, 9, 10, 11] 
1

您的代码不起作用,因为select列表在索引0处没有项目。

如果我要实现类似的功能,我会用filter与决定的函数哪些元素应该选择:

ages = [5, 15, 3, 7, 18, 34, 9, 10] 

def check_age(age): 
    # we could implement all sorts of logic here 
    # if we return True, the element is selected 
    return age > 10 

children_over_ten = filter(check_age, ages) 

print(children_over_ten) 

或者干脆使用列表中理解,如果选择的标准很简单:

ages = [5, 15, 3, 7, 18, 34, 9, 10] 
children_over_ten = [x for x in ages if x > 10] 
print(children_over_ten) 
1

您应该尝试使用列表推导,它可以用于过滤数据。

例如具有交互式蟒会话,

>>> data = [i*0.25 for i in range(0, 21)] 
>>> data 
[0.0, 0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.25, 4.5, 4.75, 5.0] 
>>> [x for x in data if abs(2.5 - x) <= 0.5] 
[2.0, 2.25, 2.5, 2.75, 3.0] 

,其选择是在范围内的数据[2.0,3.0]。

迭代通过阵列经常可以实现,而无需使用索引,例如

for x in array: 
    print(x) 
1

需要初始化选择相应

def select(x): 
    count = 0 
    select = [[],[],[]]    #0 
    for i in range(0,len(x[0])): 
     if ((int(x[4][i])+0.5) > x[4][i] > (int(x[4][i])-0.5) ): 
     select[0]+=[x[0][i]] #1 
     select[1]+=[x[1][i]] #2 
     select[2]+=[x[4][i]] #3 
     count = count + 1 
    return select 
+0

感谢您的时间,在此之后,我得到'TypeError:您必须先set_array for mappable',有什么想法?说实话,我不知道'+ ='是做什么的。 – DonkeyKong

+0

'a + = b'是'a = a + b'的简称。对于列表,+进行连接。 – innoSPG

+0

@DonkeyKong,我刚刚编辑了问题,我没有将右侧列入清单。我刚刚在rhs上添加了[] []。你也可以使用'append'而不是拼接。 – innoSPG

1

或者声明选择= [],并且这样来做:

def select(x): 
    count = 0 
    select = [] #0 
    for i in range(0,len(x[0])): 
     if ((int(x[4][i])+0.5) > x[4][i] > (int(x[4][i])-0.5) ): 
     row = [x[r*r][i] for r in range(3)] 
     select.append(row) 
     count = count + 1 
    return select