Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 同时从两个列表中弹出值_Python_List - Fatal编程技术网

Python 同时从两个列表中弹出值

Python 同时从两个列表中弹出值,python,list,Python,List,这里发生了一些奇怪的事情,至少对我来说很奇怪。我试图从一个列表中弹出“nan”值,并从另一个列表中弹出相应的值。我被告知您无法从正在枚举的列表中弹出,因此我制作了一个临时列表 import numpy as np a=[] b=[] for i in range(0,100): #alternating list of ints and nan if i/2. == i/2: a.append(i) else: a.append(np.mean

这里发生了一些奇怪的事情,至少对我来说很奇怪。我试图从一个列表中弹出“nan”值,并从另一个列表中弹出相应的值。我被告知您无法从正在枚举的列表中弹出,因此我制作了一个临时列表

import numpy as np
a=[]
b=[]

for i in range(0,100): #alternating list of ints and nan
    if i/2. == i/2:
        a.append(i)
    else: 
        a.append(np.mean([])) #the only way I know how to make nan
    b.append(i*100)

atemp=a
print(len(a),len(atemp))
for i,v in enumerate(atemp):
    if np.isnan(v):
        a.pop(i)
        b.pop(i)
print(len(a),len(atemp))
发生了一些我不明白的事情:

1它似乎是从atemp和a中弹出NAN,尽管我只是告诉它a.popi而不是atemp.popi。是否存在某种函数重载或与a和atemp相等的东西,我看不到?如何使它们完全分开,即仅从a中弹出,而不从a中弹出

2没有弹出所有的nan,必须多次重复for循环才能弹出所有的nan,这是怎么回事

# use this to filter None values in b
a, b = zip(*((x,y) for x,y in zip(a, b) if y))

# use this to filter np.nan in b
a, b = zip(*((x,y) for x,y in zip(a, b) if not np.isnan(y)))

有更简单的方法,但如果您想使用自己的代码,则需要复制a,而不仅仅是创建引用并使用不同的逻辑从列表中删除元素,相反,在len a-1范围内循环将获得您想要的输出:

import numpy as np

a = []
b = []

for i in range(0, 100):  # alternating list of ints and nan
    if i % 2 == 0:
        a.append(i)
    else:
        a.append(np.nan)  #the only way I know how to make nan
    b.append(i * 100)

atemp = a[:]
print(len(a), len(atemp))

for i in range(len(a)-1,-1,-1):
    if np.isnan(a[i]):
        a.pop(i)
        b.pop(i)
print(len(a), len(atemp))
这就做到了:

a, b = zip(*[(x,y) for x,y in zip(a, b) if np.isfinite(y)])

谢谢大家。抱歉,rebeling的答案被否决了,因为它对我有很大帮助。

atemp=a表示atemp,并指向同一个列表。如果希望它们是不同的,即从atemp中删除不从a中删除,则需要atemp=a[:]。旁白:如果使用numpy,则可以直接使用np.nan来获取nan值。即使没有它,你也可以做。谢谢你的快速和有用的回复。不幸的是,对于[1]==np.nan和[1]=floatnan,我得到了False。我仍然没有得到我想要的。通过在枚举列表atemp时从列表a弹出,我遇到了弹出索引超出范围的错误。必须有一个更简单的方法。。。也许用zipa,bYepp,看看我的答案。如果您需要弹出的值,并且需要就地更新列表,则使用pop是有意义的。@Wes:记住nan不等于它本身,因此x==nan永远不会为真。我只是指出,你不需要采用空列表的平均值来得到nan。如果y证明y是其他东西,那么就用空或无替换它:如果y!=np.nan或如果不是np.isnanya[1]=nan缺少np,但u r right。请改用np.isnanx,np.nan不仅仅是一个值,它还是一个带有引用的对象。当你把它和另一个相比较时,假就有意义了。但是如果你检查类型,你就会得到它;不需要内部列表comp,需要使用生成器表达式sufficient@PadraicCunningham发电机怎么样?@rebeling,把[]换成一个很好的量程Lena-1,-1,-1…反向量程,我不知道这一点@rebeling通常你会使用反向,但因为我们使用的是pop和两个列表,所以有必要使用反向的范围