Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否有一种算法可以根据数字'将数字列表拆分为更小的列表;s号?_Python_Algorithm - Fatal编程技术网

Python 是否有一种算法可以根据数字'将数字列表拆分为更小的列表;s号?

Python 是否有一种算法可以根据数字'将数字列表拆分为更小的列表;s号?,python,algorithm,Python,Algorithm,我正在尝试构建具有以下功能的算法: 输入:[1,3,4,5,-1,-2,-3,3,4,6,-1,-2]----------->输出:[1,3,4,5],-1,-2,-3],[3,4,6],-1,-2] 输入:[1,2,-3,-4,1,2,-5,-6,-7,1,2,-1]----------->输出:[1,2],-3,-4],[1,2],-5,-6,-7],[1,2],-1] 输入:[-1,2,-1,2]----------->输出:[-1],[2],-1],[2] 我想把一个数字列表作为输入,然

我正在尝试构建具有以下功能的算法:

输入:[1,3,4,5,-1,-2,-3,3,4,6,-1,-2]----------->输出:[1,3,4,5],-1,-2,-3],[3,4,6],-1,-2]

输入:[1,2,-3,-4,1,2,-5,-6,-7,1,2,-1]----------->输出:[1,2],-3,-4],[1,2],-5,-6,-7],[1,2],-1]

输入:[-1,2,-1,2]----------->输出:[-1],[2],-1],[2]

我想把一个数字列表作为输入,然后我想要的输出是得到更小的数字列表,这样每个更小的列表包含具有相同符号的数字,同时保留原始列表的顺序

这是我到目前为止编写的代码:

def sign_function(number):
    if number >= 0:
        return True
    else:
        return False
    
def builiding_sequences(numbers):
    sequences = []
    indexes = len(numbers)-1
    i = 0
    while i < indexes:
        sequence = []
        sequence.append(numbers[i])
        while True:
            if  sign_function(numbers[i]) == sign_function(numbers[i + 1]):
                sequence.append(numbers[i+1])
                i = i + 1
            else:
                i = i + 1
                break
        sequences.append(sequence)
    return sequences
def符号功能(编号):
如果数字>=0:
返回真值
其他:
返回错误
def构建顺序(编号):
序列=[]
索引=len(数字)-1
i=0
而我认为:
序列=[]
sequence.append(数字[i])
尽管如此:
如果符号函数(数字[i])==符号函数(数字[i+1]):
sequence.append(数字[i+1])
i=i+1
其他:
i=i+1
打破
sequences.append(sequence)
返回序列

这两个函数只要我不使用完整的原始值集,就可以完成工作。因此,为什么索引等于len(number)-1,我试图获得一个算法,该算法能够使用输入列表中的完整原始值集执行此例程。提前谢谢你

标准库模块
itertools
有一个
groupby
方法(),我认为它适合您的用例。它通过应用一些函数将值分组在一起,返回函数的结果,然后返回值本身(作为一个
grouper
,我们希望将其转换为一个列表)。因此,在您的情况下,您需要:

从itertools导入groupby
def sign_功能(编号):
返回编号>=0
示例=[1,3,4,5,-1,-2,-3,3,4,6,-1,-2]
结果=[groupby中k,g的列表(g)(例如,符号函数)]
我还稍微简化了你的符号函数,一行就足够了。

>L=[1,3,4,5,-1,-2,-3,3,4,6,-1,-2]
>>>itertools中x的[list(x[1])。groupby(L,lambda x:x
lis=[1,3,4,5,-1,-2,-3,3,4,6,-1,-2]
标志,ans=0,[]
对于范围内的i(len(lis)):
如果标志>=0且lis[i]>=1:#如果上一个是无趋势(标志=0)或正趋势且当前元素也是正的
ans.append(lis[i])
标志=1
elif标志
def检查编号(编号1、编号2):

如果(number1>=0和number2>=0)或(number1<0和number2很好地使用了itertools的groupby!:)回答得好!非常感谢!谢谢你,伍德福德先生!非常感谢!
lis = [1,3,4,5,-1,-2,-3,3,4,6,-1,-2]
flag,ans=0,[]

for i in range(len(lis)):
    if flag>=0 and lis[i]>=1:  # if previous was no trend (flag=0) or positive trend and curr element is also positive
        ans.append(lis[i])
        flag=1
    elif flag<=0 and lis[i]<=-1:   # if previous was no trend (flag=0) or negative trend and curr element is also negative
        ans.append(lis[i])
        flag=-1
    else:
        print(ans)  # print ans, flag = 0 means no trend
        ans.clear()
        ans.append(lis[i])
        flag=0
if ans:           # if ans is not empty print
    print(ans)
def check_numbers(number1,number2):
    if (number1 >= 0 and number2 >=0) or (number1 < 0 and number2 <0) :
        return True
    else:
        return False
    
def builiding_sequences(numbers):
    seq = []
    j=0
    num_len = len(numbers)
    for i in range(num_len-1):
      if check_numbers(numbers[i],numbers[i+1]):
        continue
      else:
        seq.append(numbers[j:i+1])
        j=i+1
    seq.append(numbers[j:])
    return seq
    
print(builiding_sequences([-3,1,3,4,5,-1,-2,-3,3,4,6,-1,-2]))
print(builiding_sequences([1,2,-3,-4,1,2,-5,-6,-7,1,2,-1]))
print(builiding_sequences([-1,2,-1,2]))