是否有一个很好很简单的方法来判断一个python列表(或numpy数组)是否包含带交替符号的数字?换句话说:检测交替符号
is_alternating_signs([1, -1, 1, -1, 1]) == True
is_alternating_signs([-1, 1, -1, 1, -1]) == True
is_alternating_signs([1, -1, 1, -1, -1]) == False
是否有一个很好很简单的方法来判断一个python列表(或numpy数组)是否包含带交替符号的数字?换句话说:检测交替符号
is_alternating_signs([1, -1, 1, -1, 1]) == True
is_alternating_signs([-1, 1, -1, 1, -1]) == True
is_alternating_signs([1, -1, 1, -1, -1]) == False
好的,这要归功于SO“相关”功能。我发现this question并通过ianalis答案,并通过lazyr
def is_alternating_signs(a):
return numpy.all(numpy.abs(numpy.diff(numpy.sign(a))) == 2)
print is_alternating_signs([1, -1, 1, -1, 1])
print is_alternating_signs([-1, 1, -1, 1, -1])
print is_alternating_signs([1, -1, 1, -1, -1])
注释输出是
True
True
False
你可以检查每一个偶数成员为负,且每一个奇数成员采取的片为正每个第二个项目,从开始或从第一个位置开始。同时测试相反的结果以涵盖两种可能性。
这样:
def is_alternating_signs(l):
return ((all(x<0 for x in l[::2]) and all(x>=0 for x in l[1::2])) or
(all(x>=0 for x in l[::2]) and all(x<0 for x in l[1::2])))
为什么'x> = 0'而不是'x> 0'? –
这实际上取决于我们如何定义“交替符号” - 我可以看到任何一种方式,取决于您是否将零与非负数组合(即将“符号”视为我们是否通常用负号来书写)还是将其放入其中自己的无牌类别。 (虽然在这种情况下,你甚至可能会认为[1,0,1,0]是“交替符号”) – Brian
from decimal import Decimal
a = [1, -1, 1, -1, 1]
b = [-1, 1, -1, 1, -1]
c = [1, -1, 1, -1, -1]
def is_alternating_signs(values):
lVals = [Decimal(val).is_signed() for val in values]
prevVal = lVals.pop(0)
for val in lVals:
if prevVal == val:
return False
prevVal = val
return True
is_alternating_signs(a)
is_alternating_signs(b)
is_alternating_signs(c)
我喜欢成对:
from itertools import izip, tee
def pairwise(iterable):
a, b = tee(iterable)
next(b)
return izip(a, b)
def is_alternating_signs(iterable):
return all(x < 0 < y or x > 0 > y for x, y in pairwise(iterable))
如果在iterable
没有零点这也适用:
def is_alternating_signs(iterable):
return all((x < 0) == (0 < y) for x, y in pairwise(iterable))
怎么像...
def is_alternating_signs(aList):
return all((aList[i]^aList[i-1])<0 for i in range(1,len(aList)))
什么只是通过一次和测试循环的直接的解决方案?很可能也是最快的,因为许多其他解决方案多次循环访问列表。
def signs_are_alternating(numbers):
"""Return True if numbers in given list have alternating signs, False
otherwise. If given list has less than 2 elements, return False.
>>> signs_are_alternating([1, -1, 1, -1, 1])
True
>>> signs_are_alternating([-1, 1, -1, 1, -1])
True
>>> signs_are_alternating([1, -1, 1, -1, -1])
False
"""
if len(numbers) < 2:
return False
previous_positive = (numbers[0] < 0) # Pretend it starts alternating
for number in numbers:
this_positive = (number >= 0)
if previous_positive == this_positive:
return False
previous_positive = this_positive
return True
请注意,如果输入列表少于2个元素,我不太确定预期行为。
这里是我的一行代码,这比其他的一些建议,可能效率较低:
def is_alternating_signs(lst):
return all(x * y < 0 for x, y in zip(lst, lst[1:]))
这也是TRUE;为'[0,1,0,1,0]'。我的建议:'numpy.all(numpy.abs(numpy.diff(numpy.sign(a))== 2)' –