同时从两个列表中弹出值

2024-04-25 14:06:36 发布

您现在位置:Python中文网/ 问答频道 /正文

这里发生了一些奇怪的事情(至少对我来说是奇怪的)。我正在尝试从一个列表中弹出'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.pop(I)而不是流行音乐(i) 是的。有没有什么函数重载或者等同于a和atemp的东西我看不到?我如何使它们完全独立的列表(即只从a弹出而不是atemp)?你知道吗

2)没有弹出所有的nan,必须重复for循环多次才能弹出所有的nan


Tags: inimportnumpy列表forlenifnp
3条回答

有更简单的方法,但是如果您想使用自己的代码,您需要复制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)])

谢谢大家。抱歉,丽贝林的回答被否决了,因为它对我有很大帮助。你知道吗

这个怎么样

# 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)))

相关问题 更多 >