Python Forum
getting previous/next valid value in a list, cyclically
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
getting previous/next valid value in a list, cyclically
#1
I have a list of values... some are valid, some invalid (containing None). I test each element for validity. When I find an invalid element, I need to find indexes of the closest previous and the closest next valid value. I need to treat the list as a cycle, so if there are no valid elements before/after the initial element, it should search from the end/start of the list... This way, if there is at least one valid value in the list, both the previous and the next valid value will be found (it can be the same index, if there is only one valid value in the list).

I am able to solve it, but with a ridiculously complicated code. Could you help me find some elegant solution? I am not a programmer, just using my very humble programming skills to process data in another field.
Reply
#2
Can you post what you've tried, and some sample uses of the code?
Reply
#3
example_values = [None, None, 2, None, 4, None, None, 7, None, None]
for i, v in enumerate(example_values):
    if v is not None:
        print("value at position {} is valid: {}".format(i,v))
    else:
        print("value at position {} is invalid".format(i))
        prev_valid = False
        next_valid = False
        for j, w in enumerate(example_values):
            if j < i and w is not None:
                prev_valid = j
        if not prev_valid:
            for j, w in enumerate(example_values):
                if w is not None:
                    prev_valid = j
        for j, w in enumerate(example_values):
            if j > i and w is not None:
                next_valid = j
                break
        if not next_valid:
            for j, w in enumerate(example_values):
                if w is not None:
                    next_valid = j
                    break
        print("  previous valid value is at position {}".format(prev_valid))
        print("  next valid value is at position {}".format(next_valid))
Reply
#4
Can you give a very, very simplified example of what you want? It seems extremely complex right now, and I'm not sure if it's because of the requirements or the implementation.
Reply
#5
You can use module bisect
import bisect as bs

def valid_indexes(seq):
    return [i for i, v in enumerate(seq) if v is not None]

def prev_valid(valid, i):
    return valid[bs.bisect_left(valid, i) - 1]

def next_valid(valid, i):
    return valid[bs.bisect_right(valid, i) % len(valid)]

if __name__ == '__main__':
    example_values = [None, None, 't', None, 'f', None, None, 's', None, None]
    valid = valid_indexes(example_values)
    for i, v in enumerate(example_values):
        if v is not None:
            print("value at position {} is valid: {}".format(i,v))
        else:
            print("value at position {} is invalid".format(i))
            print("  previous valid value is at position {}".format(prev_valid(valid, i)))
            print("  next valid value is at position {}".format(next_valid(valid, i))) 
Reply
#6
(Mar-19-2018, 11:03 PM)Gribouillis Wrote: You can use module bisect

Thanks! Works perfectly.
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Script getting reindexing only valid error cubangt 1 798 Dec-07-2023, 04:06 PM
Last Post: cubangt
Question Use function, retry until valid Ashcora 8 1,406 Jan-06-2023, 10:14 AM
Last Post: Ashcora
  checking for valid hexadecimal digits Skaperen 3 6,269 Sep-02-2021, 07:22 AM
Last Post: buran
  Limiting valid values for a variable in a class WJSwan 5 3,514 Jul-06-2020, 07:17 AM
Last Post: Gribouillis
  How to verify the give number is valid Mekala 3 2,357 May-16-2020, 02:40 PM
Last Post: anbu23
  C:\Windows\System32\appwiz.cpl is not a valid Win32 application Marceepoo 8 5,041 Mar-15-2020, 04:46 AM
Last Post: buran
  is a str object a valid iterator? Skaperen 6 5,546 Jan-27-2020, 08:44 PM
Last Post: Skaperen
  How to get valid error message while invoking REST API through Python gollupraveen 0 2,049 Oct-04-2019, 07:15 PM
Last Post: gollupraveen
  How to keep looping until the user input is valid ? KyawMyo 12 6,093 Jun-10-2019, 02:51 AM
Last Post: KyawMyo
  Dict overwrite previous list vincentspm 1 2,184 Mar-20-2019, 12:31 PM
Last Post: scidam

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020