检查交替奇偶校验

Checking for alternating parity

我正在努力寻找一种方法来检查列表中的每个其他数字是否具有交替奇偶校验(即偶数、奇数、偶数、奇数等)

[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)

有人知道我该如何检查吗?

试试这个函数,l 用于列表理解并得到 bool 用于奇数或偶数,然后检查是否全部为真(每隔一个偶数索引元素全部为真或全部为假,并且与每个奇数索引元素相同:

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

虽然看起来有点复杂

这里

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

您可以遍历序列的所有索引,然后将其与下一个进行比较:

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

您可以对输入列表中的相邻值使用 Python 取模运算符 %,并在迭代时检查是否相等。

如果您选择这条路线并且担心效率,我建议您使用 NumPy / numba 等第 3 方库,这样迭代就不会在 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