我有一个从左到右阅读的数字列表。 每当我在阅读序列时遇到符号变化时,我都想对其进行计数。

X = [-3,2,7,-4,1,-1,1,6,-1,0,-2,1] 
X = [-, +, +, -, +, -, +, +, -, -,-,+]

因此,在此列表中有 8 个符号更改。

当项目[0] (在本例中为 -3)为负时,它被视为符号更改。 此外,列表中的任何 0 都被视为[-]

任何帮助将不胜感激。

#1楼 票数:15 已采纳

您可以使用itertools.groupby来计算正数和非正数的组:

>>> x = [-3,2,7,-4,1,-1,1,6,-1,0,-2,1] 

>>> import itertools
>>> len(list(itertools.groupby(x, lambda x: x > 0)))

结果:

8

在您的问题中,您声明您想要:

  • 计算变化,而不是组
  • 如果第一个元素不是正数,则计算额外的变化。

您可以通过直接测试第一个元素并调整结果来做到这一点:

>>> len(list(itertools.groupby(x, lambda x: x > 0))) - (x[0] > 0)

或者在进行分组之前在输入中添加一个正数,然后从结果中减去 1:

>>> len(list(itertools.groupby(itertools.chain([1], x), lambda x: x > 0))) - 1

注意您的输入列表是否可能为空 - 前一个解决方案将引发异常。

#2楼 票数:6

X = [-3,2,7,-4,1,-1,1,6,-1,0,-2,1]

last_sign = 1
sign_changes = 0

for x in X:
    if x == 0:
        sign = -1
    else:
        sign = x / abs(x)

    if sign == -last_sign:
        sign_changes = sign_changes + 1
        last_sign = sign

print sign_changes

#3楼 票数:1

这是一个使用 fold 的解决方案,玩得开心:

def lolwut((x,c), y):
    return (y, c+(x^y))

print reduce( lolwut ,(x > 0 for x in X), (True,0)) # 8
print reduce( lolwut ,(x > 0 for x in X), (False,0)) # 7

#4楼 票数:1

这是一种无需循环的方法......对于大数据应该快得多;)(但是,由于numpy等,对于小列表效率不高 - 而且对于numpy数组会比出于显而易见的原因列出 - 您甚至可以放弃转换...)

x = np.array([-3,2,7,-4,1,-1,1,6,-1,0,-2,1])
positive= x>0
count = np.logical_xor(positive[1:],positive[:-1]).sum()
count += not(positive[0])
print count

返回 8

如果两个布尔值不同(从 + 到 - )并且非常快,则 Xor 返回 true 。 代码有一个问题:如果某个东西从正号变为 0,它将被视为交叉。 这正是您在问题中提出的问题,因为您将 0 表示为“-”。

#5楼 票数:1

对于整数,如果ab 的符号不同,则(a^b) < 0

def countSignChanges(seq):
    # make sure 0's are treated as negative
    seq = [-1 if not x else x for x in seq]

    # zip with leading 1, so that opening negative value is 
    # treated as sign change
    return sum((a^b)<0 for a,b in zip([1]+seq, seq))


X = [-3,2,7,-4,1,-1,1,6,-1,0,-2,1]
print countSignChanges(X)

给出想要的答案, 8

#6楼 票数:0

numbers = [-3,2,7,-4,1,-1,1,6,-1,0,-2,1]
# could be replaced by     signs = [x > 0 for x in numbers]
# but this methods gives us nice minus and plus signs
signs = map(lambda x: "+" if x > 0 else "-", numbers)

# zip(…) creates the pairs, each pair that has different signs
# adds one to "count"
count = sum(1 for x,y in zip(signs[:-1], signs[1:]) if x != y)

-> 7

对于您的额外要求,列表开头的负数应被视为另一个更改,只需在列表中添加一个正数即可。

如果您正在处理庞大的列表,请考虑使用生成器。 (izip,三通,...)

#7楼 票数:0

如果您还没有被说服阅读 itertools 文档:

def pairs(iterable):
    'iter -> (iter0, iter1), (iter1, iter2), (iter3, iter4), ...'
    from itertools import izip, tee
    first, second = tee(iterable)
    second.next()
    return izip(first, second)

def sign_changes(l):
    result = 0
    if l and l[0]<=0: result += 1
    result += sum(1 for a,b in pairs(l) if b*a<=0 and (a!=0 or b!=0))
    return result

#8楼 票数:0

Input = [-1, 2, 3, -4, 5, -6, 7, 8, -9, 10, -11, 12] 

for i in range(len(Input)):
    if(Input[i]<1):
        Input[i]=0
    else:
        Input[i]=1

print(Input) #[0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1]

count=0
check=Input[0]
for i in range(len(Input)-1):

    if check != Input[i + 1]:
        count+=1
        check=Input[i+1]


print(count) #9

  ask by Captain Cretaceous translate from so

未解决问题?本站智能推荐:

1回复

Python3:用n个值计算百分比变化

我有一个函数应该计算两个值之间的百分比增加/减少。 函数中的参数是 original_value 和 new_value。 问题:我需要程序取 n 个值,例如六个值,然后对每对值运行该函数。 一个例子: 值是 1、2、3、4、5 和 6。然后我需要程序来计算平均值。 1 和 2、2 和 3、3 和
3回复

在python列表中分离和计算表情符号

我想计算python列表中表情符号的出现次数。 假设我的列表看起来像这样 li = ['😁', '🤣😁', '😁🤣😋'] Counter(li) 会给我 {'😁': 1, '🤣😁': 1, '😁🤣😋': 1} 但我想得到表情符号的总数,又名 {'😁': 3, '🤣':
2回复

Python函数有2个列表,但只有1个变化

为什么Lista1会被更改但Lista2不会被更改? 哪些方法可以直接更改列表?
2回复

计算二维列表python中周围正方形中的符号数

我在 python 课程介绍中有一个作业,我必须制作一个函数,该函数使用循环遍历 2d 列表,并且当给定 x 和 y 坐标时,它会计算所选正方形周围正方形中有多少“N”。 x 和 y 可以在任何地方,并且不允许跨越列表的边界。 出于某种原因,课程材料似乎非常缺乏,我找不到任何可以帮助我入门的东西。
4回复

拥有列表并尝试在Python中创建多项式(符号计算)

假设我有以下列表: 我可以使用两种方法计算列表中每个整数的数量。 第一: 或第二: 第二种方法更可取,因为它会向我抛出一个列表。 现在,我想将输出转换为多项式,其中子列表的第一个元素是x的幂,子列表的第二个元素是系数,最后将它们求和以形成多项式,这样我得到: 为了使这个多项
4回复

多个sigma符号python

给定此公式在python中实现它 因此对于n = 3 这很有效。 但是说我想要第三个sigma符号,例如 通过添加另一个循环k,与上面完全相同。 我的问题是,如果有一种方法可以在给定n的函数中对此进行推广,即内部的值(即j ^ 2 * i)。 我很难理解更多循环
3回复

python以变化的方式乘法列表元素

我想衰减列表中的元素,以使每5个元素将减少一半。 例如,长度为10的列表将变为: [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] 我尝试了列表推导和基本的for循环,但是我无法解释其背后的逻辑。
2回复

在Python列表中找到重大变化

所以我有这段代码 从此处获取并修改了一点从PIL获取像素值列表,以给出边界区域(用户选择)内的像素值(all_pixels)列表。 在尝试记录一系列相似值之后,我试图找出一种有效的方法来检测列表中的更改。 由于列表似乎从上到下以及从左到右列出了像素值。 在我将要使用的场景中,它将具有