【问题标题】:Checking for alternating parity检查交替奇偶校验
【发布时间】:2019-03-08 03:20:29
【问题描述】:

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

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

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

【问题讨论】:

  • for if x%2...一切从尝试开始...
  • 这不是一个简单的问题...一直在努力。似乎无法通过:for i in range(len(lst)-1): if lst[i] % 2 == 0 and lst[i+1] % 2 != 0: return True 我似乎只检查了第一个和第二个元素而无处可去。
  • 然后显示您尝试过的内容...
  • 请将您的代码放入问题本身。
  • 遍历你的数组并检查当前元素的奇偶校验是否与下一个元素的奇偶校验相同。如果是这样,您就没有交替奇偶校验。仅当您可以遍历整个数组(最后一个元素除外)时,奇偶校验才会交替出现。

标签: python for-loop parity


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    试试这个函数,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
    

    看起来有点复杂

    【讨论】:

    • 你能不能让它更神秘一点?我仍然可以理解它是如何工作的......
    • 您好,我想知道您能否解释一下您如何决定在第二部分中对数组进行切片?
    • @Julien 我现在解释
    【解决方案3】:

    这里

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

    【讨论】:

    • else: continue 没用
    【解决方案4】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-29
      • 2015-05-31
      • 2013-06-25
      • 1970-01-01
      • 1970-01-01
      • 2019-10-09
      • 2020-08-29
      • 1970-01-01
      相关资源
      最近更新 更多