首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查列表是否为交替形式的程序。

检查列表是否为交替形式的程序。
EN

Stack Overflow用户
提问于 2016-08-16 08:06:10
回答 3查看 3.5K关注 0票数 0

我试图用Python编写一个函数,检查给定的整数列表是否严格交替,i.e.alternately是否严格上下交替。

例如:

代码语言:javascript
复制
alternating([]) = True

alternating([1,3,2,3,1,5]) = True

alternating([3,2,2,1,5])= False

alternating([3,2,1,3,5]) =  False

这是我所能想到的代码,但它并不适用于空列表,对其余的代码确实有效,而我所做的任何更改都会给我带来所有其余的错误。

代码语言:javascript
复制
def alternating(list):
  for i  in range(1,len(list)):
    if (((list[i]>list[i+1]) and (list[i]>list[i-1])) or ((list[i]  <list[i+1]) and (list[i]<list[i-1]))) :
      return True
    else:
      return False
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-16 08:13:50

我会这样做:

代码语言:javascript
复制
def alternating(l):
    return all(cmp(a, b)*cmp(b, c) == -1 for a, b, c in zip(l, l[1:], l[2:]))

assert alternating([]) is True
assert alternating([1, 3, 2, 3, 1, 5]) is True
assert alternating([3, 2, 2, 1, 5]) is False
assert alternating([3, 2, 1, 3, 5]) is False
assert alternating([1, 3, 2, 3, 2, 1]) is False

以下是两个更简单的版本:

代码语言:javascript
复制
def alternating(l):
    for i in range(len(l)-2):
        if (l[i] < l[i+1]) and (l[i+1] > l[i+2]):
            continue
        if (l[i] > l[i+1]) and (l[i+1] < l[i+2]):
            continue
        return False
    return True
代码语言:javascript
复制
def alternating(l):
    for i in range(len(l)-2):
        if (l[i] < l[i+1]) and (l[i+1] < l[i+2]):
            return False
        if (l[i] > l[i+1]) and (l[i+1] > l[i+2]):
            return False
        if (l[i] == l[i+1]) or (l[i+1] == l[i+2]):
            return False
    return True
票数 5
EN

Stack Overflow用户

发布于 2016-08-16 08:22:56

下面是一个简单的方法:

代码语言:javascript
复制
def alternating(l):
  for i in range(1, len(l) - 1):
    if not (l[i - 1] < l[i] > l[i + 1] or
            l[i - 1] > l[i] < l[i + 1]):
      return False
  return True

print alternating([])
print alternating([1,3,2,3,1,5])
print alternating([3,2,2,1,5])
print alternating([3,2,1,3,5])
票数 3
EN

Stack Overflow用户

发布于 2016-08-16 08:18:49

基本错误#1:

代码语言:javascript
复制
for i  in range(1,len(list)):
    if (((list[i]>list[i+1]) and (list[i]>list[i-1])) or ...:
        return True

在算法透视图中,您不可能通过只检查n元素来确定n元素的列表是交替的。

基本错误2:

您的函数并不总是返回值。虽然这在Python中不是强制性的,但在您的具体情况下,您可能希望它返回一个值,甚至返回一个布尔值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38969629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档