Перебор массива (найти x+1 элемент )

Условие задачи если кому-то интересно:

Given a sequence of items and a specific item in that sequence, return the item immediately following the item specified. If the item occurs more than once in a sequence, return the item after the first occurence. This should work for a sequence of any type. When the item isn't present or nothing follows it, the function should return nil in Clojure and Elixir, Nothing in Haskell, undefined in JavaScript, None in Python.

Я написал код который находит элемент в массиве и выводит следующий за ним, но он не работает с последним условием тестов ниже, как это можно исправить, чтобы он работал и с последним условием:

def next_item(xs, item):
   lenght , i = len (list(xs)) , 0
   while i < lenght:
       if item == xs [i]:
          if i+1 < lenght:
              return xs [i+1]
       i += 1

Вот код тестов:

print (next_item ([1, 2, 3, 4, 5, 6, 7, 8], 5), 6)
print (next_item (['a', 'b', 'c'], 'd'), None)
print (next_item (['a', 'b', 'c'], 'c'), None)
print (next_item ('testing', 't'), 'e')
print (next_item (iter(range(1, 30000)), 12), 13)

p.s: Можно еще описать в ответе, что делает iter() в 5 тесте


Ответы (2 шт):

Автор решения: Zhihar

Чуть измените ваш код - переведите полученные данные в список:

def next_item(xs, item):
    arr = list(xs)
    lenght, i = len(arr), 0
    while i < lenght:
        if item == arr[i]:
            if i+1 < lenght:
                return arr[i+1]
        i += 1

после этого вы можете работать с итерируемыми объектами, обращаясь по индексу и т.д.

а что мешает сделать в лоб?

def find(arr, value):
    data = list(arr)
    # проверить, существует ли элемент в списке
    if value in data:
        # получить индекс искомого элемента
        index = data.index(value)

        # проверить, существуют ли элементы за найденным элементом
        if index < len(data) - 1:
            return data[index + 1]
        else:
            return None
    else:
        return None


arr = [1, 5, 7, 11, 0, 3]

value = 11

print(find(arr, 11))  # вернет 0, ибо он следует за 11
print(find(arr, 3))   # вернет None ибо 3 - последний элемент в списке
print(find(arr, 111)) # вернет None ибо 111 нет в списке
→ Ссылка
Автор решения: CrazyElf

Например, можно так ещё сделать. Люблю понятные, линейные решения, без лишнего шаманства с индексами:

def next_item(seq, item):
    found = False
    for i in seq:
        if found:
            return i
        if i == item:
            found = True

Вывод тестов:

6 6
None None
None None
e e
13 13
→ Ссылка