Проверка на чередующийся паритет - PullRequest
0 голосов
/ 03 октября 2018

Я изо всех сил пытаюсь найти способ проверить, имеет ли каждое другое число в моем списке чередующийся паритет (то есть четное, нечетное, четное, нечетное и т. Д.)

[1,2,3,4] # odd, even, odd, even (True, because they alternate)
[1,3,2,4] # odd, odd, even, even (False, because they don't alternate)

У кого-нибудь есть идеикак я могу проверить это?

Ответы [ 4 ]

0 голосов
/ 03 октября 2018

Вы можете использовать оператор модуля Python % для смежных значений в списке ввода и проверять равенство во время итерации.

Если вы выбираете этот маршрут, и эффективность является проблемой, я советую использовать стороннююбиблиотеки, такие как NumPy / numba, поэтому итерация не выполняется на уровне Python:

from numba import jit

@jit(nopython=True)
def check_alt_parity(L):
    for i in range(len(L)-1):
        if L[i] % 2 == L[i+1] % 2:
            return False
    return True

def check_alt_parity_list(L):
    for i in range(len(L)-1):
        if L[i] % 2 == L[i+1] % 2:
            return False
    return True

A = [1, 2, 3, 4] * 10000
B = [1, 3, 2, 4] * 10000

%timeit check_alt_parity(A)       # 780 µs
%timeit check_alt_parity_list(A)  # 9.09 ms
0 голосов
/ 03 октября 2018

Здесь

def alter(ls):
  for i in range(len(ls)-1):
      if ls[i]%2 == ls[i+1]%2:
         return False
  return True
0 голосов
/ 03 октября 2018

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

def is_alternating_parity(seq):
    for i in range(len(seq) - 1):
        if seq[i] % 2 == seq[i + 1] % 2:
            return False
    return True

print(is_alternating_parity([1, 2, 3, 4]))  # True
print(is_alternating_parity([1, 3, 2, 4]))  # False
0 голосов
/ 03 октября 2018

Попробуйте эту функцию, l для понимания списка и получения bool для нечетного или четного, затем проверяете, все ли верны (каждый второй элемент четного индекса равен True или все False, и то же самое для каждого нечетного элемента index:

def oddeven_alter(l):
    l=[i%2 for i in l]
    return all([any([all(l[::2]),all(not i for i in l[::2])]),any([all(l[1::2]),all(not i for i in l[1::2])])])
)
print(oddeven_alter([1,2,3,4]))
print(oddeven_alter([1,3,2,4]))

Выход:

True
False

Вид сложного вида,

...