Group data in a list with missing values as delimeter

Question:

I have an extended question following this question: I want to group data in a list with missing values as delimiter.

For example I have a list like this:

data = [1, 2, 3, nan, nan, nan, 4, 5, 6, nan, nan, 7, nan, 8, 9, nan, 0, 0, 'hello']
from math import nan

data = [1, 2, 3, nan, nan, nan, 4, 5, 6, nan, nan, 7, nan, 8, 9, nan, 0, 0, 'hello']

from itertools import groupby

g = groupby(data, key=type)  # group by type of the data, int != float

groups = [list(a[1]) for a in g if a[0] != float]  

print(groups)  

I got this results:

[[1, 2, 3], [4, 5, 6], [7], [8, 9], [0, 0], ['hello']]

Expected results:

[[1, 2, 3], [4, 5, 6], [7], [8, 9], [0, 0, 'hello']]

What I have tried by adjusting the groups variable but it did not work:

groups = [list(a[1]) for a in g if a[0] != float or a[0] == str]

How can I adjust this in order to mix the value between integer and string?

Asked By: Erwin

||

Answers:

You can use isinstance() in groupby key function:

from itertools import groupby

g = groupby(data, key=lambda v: isinstance(v, float))
groups = [list(a[1]) for a in g if not a[0]]
print(groups)

Prints:

[[1, 2, 3], [4, 5, 6], [7], [8, 9], [0, 0, 'hello']]
Answered By: Andrej Kesely
from math import nan
data = [1, 2, 3, nan, nan, nan, 4, 5, 6, nan, nan, 7, nan, 8, 9, nan, 0, 0, 'hello']

result = [[]]

for value in data:
    if value is not nan:
        result[-1].append(value)
    else:
        if result[-1]:
            result.append([])
if not result[-1]:
    del result[-1]
print(result)
Answered By: islam abdelmoumen

You can do it with groupby + filter

In [1]: list(filter(lambda x: x[0] is not nan, [list(l) for _, l in groupby(data, key=lambda x: x is nan)]))
Out[1]: [[1, 2, 3], [4, 5, 6], [7], [8, 9], [0, 0, 'hello']]
Answered By: Rahul K P
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.