简体   繁体   中英

Remove a tuple containing nan in list of tuples — Python

I have a long list of tuples and want to remove any tuple that has a nan in it using Python.

What I currently have: x = [('Recording start', 0), (nan, 4), (nan, 7), ..., ('Event marker 1', 150)]

Result I'm looking for: x = [('Recording start', 0), ('Event marker 1', 150)]

I've tried use np.isnan and variants of that, but have had no success and keep getting an error: ufunc 'isnan' is not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule "safe"

Any suggestions would be appreciated!!

You could use list comprehension which checks if any of the items in a tuple is NaN. Check is done by first checking the type and then with math.isnan since it doesn't work for other types:

import math

x = [('Recording start', 0), (float('nan'), 4), (float('nan'), 7), ('Event marker 1', 150)]
res = [t for t in x if not any(isinstance(n, float) and math.isnan(n) for n in t)]
print(res)

Output:

[('Recording start', 0), ('Event marker 1', 150)]

Using list comprehension:

x = [('Recording start', 0), (nan, 4), (nan, 7), ('Event marker 1', 150)]

new = [i for i in x if nan not in i]
res = [n for n in x if not nan in n]

返回x中没有对象nan所有对象。

At least at my python usage of nan retured the 'not defined error', this is why I defined it by my self. I think you can use a Python filter function for yor needs. See the example:

nan = float('nan')
lst = [('Recording start', 0), (nan, 4), (nan, 7), ('Event marker 1', 150)]
y = filter( lambda x: nan not in x, lst)
print y

[('Recording start', 0), ('Event marker 1', 150)]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM