Home > other >  checking if list contains same element in straight row
checking if list contains same element in straight row

Time:02-06

so,I have a list [5. 5. 5. 5. 0. 0.] I want to check if it contains same elements in straight row (atleast 4 )

I came up with this

for i in list:
    w = []
    for x in range(len(i)-4):
        if (i[x] == i[x 1] == i[x 2] == i[x 3] != 0) :
            print(i[x])
            break

I gives me desired output,

but , what would the efficient way to achieving the same result ,without much looping ?

CodePudding user response:

In numpy it's worth to find indices of value changes and return every index that preceeds another index that differs not less than 4.

x = np.array([6,6,6,6,7,7,8,8,4,4,4,4,4,4,4,3,3,3,3])
div_points = np.flatnonzero(np.diff(x, prepend=x[0] 1, append=x[-1] 1))
idx = np.r_[np.diff(div_points)>=4, False]
x[div_points[idx]]
>>> array([6, 4, 3])

And if you're quite lazy, you could just 'slide' all the comparisons:

view = np.lib.stride_tricks.sliding_window_view(x, 4)
view
array([[6, 6, 6, 6],
       [6, 6, 6, 7],
       [6, 6, 7, 7],
       [6, 7, 7, 8],
       [7, 7, 8, 8],
       [7, 8, 8, 4],
       [8, 8, 4, 4],
       [8, 4, 4, 4],
       [4, 4, 4, 4],
       [4, 4, 4, 4],
       [4, 4, 4, 4],
       [4, 4, 4, 4],
       [4, 4, 4, 3],
       [4, 4, 3, 3],
       [4, 3, 3, 3],
       [3, 3, 3, 3]])

r = np.all(x[:-3, None] == view, axis=1)
x[:-3][r]
>>> array([6, 4, 4, 4, 4, 3])

CodePudding user response:

Try this:

lst = [3, 5, 5, 5, 5, 0, 0]

for i in range(4, len(lst)):
    if len(set(lst[i-4:i]))==1:
        print(lst[i-4])

CodePudding user response:

Here's a one-liner that will return the indexes of all items in the specified 1D array that are identical to the next N items. Note that it requires the array be of floats because it uses NaN.

import functools as ft

N = 3
indexes = np.where(ft.reduce(lambda prev, cur: prev.astype(bool) & (cur == a), [np.pad(a, (0,i), constant_values=np.nan)[i:] for i in range(1, N 1)]))[0]

Example:

>>> import functools as ft
>>> a = np.array([1, 2, 3, 3, 3, 3, 4, 5, 10, 10, 10, 10, 10, 2, 4], dtype=float)
>>> N = 3
>>> indexes = np.where(ft.reduce(lambda prev, cur: prev.astype(bool) & (cur == a), [np.pad(a, (0,i), constant_values=np.nan)[i:] for i in range(1, N 1)]))[0]
>>> indexes
array([2, 8, 9])

Now, if we look at the array and the indexes:

[1, 2, 3, 3, 3, 3, 4, 5, 10, 10, 10, 10, 10, 2, 4]
       ^ 2               ^^ 8
                             ^^ 9
  •  Tags:  
  • Related