簡體   English   中英

將python列表分為正向/負向運動/趨勢

[英]Subsetting python list into positive/negative movements/trends

很抱歉提出這個問題,但是我在這個問題上停留了一段時間。

基本上我想列出一個清單:

numbers=[1, 2, -1, -2, 4, 5]

並將此列表分為子列表,以顯示正/負運動(或趨勢)

最終結果是:

subset_list = [[1, 2], [-1, -2], [4, 5]] 

基本上,我一直在使用嵌套的while函數將正向運動附加到子集,並且當不滿足條件時,將子集附加到subset_list,然后評估是否存在負向運動。

我不斷收到IndexError ,到目前為止, subset_list僅包含[[1, 2]]

這是我的代碼:

numbers = [1,2,-1,-2,4,5]

subset = []
subset_list = []
subset.append(numbers[0])

i = 1
while i < (len(numbers)):
    if numbers[i] <= numbers[i+1]:
        subset.append(numbers[i])
        i+= 1
        while subset[-1] <= numbers[i] or numbers[i] <= numbers[i+1]:
            subset.append(numbers[i])
            i += 1
        subset_list.append(subset)
        subset = []
        i += 1
    if numbers[i] > numbers[i+1]:
        subset.append(numbers[i])
        i+= 1
        while subset[-1] <= numbers[i] or numbers[i] <= numbers[i+1]:
            subset.append(numbers[i])
            i+= 1
        subset_list.append(subset)
        subset = []
        i += 1

謝謝!

-傑克

這是一種重寫方法:


numbers=[1,2,-1,-2,4,5] 


direction = True  # positive or negative
prevdirection = True
res = [[numbers[0]]]

for previtem, item in zip(numbers[:-1], numbers[1:]):
    direction = True if item - previtem > 0 else False
    if direction != prevdirection:
        res.append([])
    prevdirection = direction
    res[-1].append(item)

print(res)    

如果趨勢變化總是經歷符號變化,則可以使用itertools.groupby()根據符號將項目“分組”:

>>> from itertools import groupby
>>>
>>> [list(v) for _, v in groupby(numbers, lambda x: x < 0)]
[[1, 2], [-1, -2], [4, 5]]

我們將_用作 “丟棄”變量的變量名 ,因為在這種情況下我們不需要分組鍵。

在python中,人們傾向於不經常使用列表中的實際索引。 嘗試使用for循環,然后檢查趨勢是否改變(將零視為與正或負不同的趨勢-您可以簡單地更改same_direction以一種或另一種方式將其分組):

def same_direction(num1, num2):
    # both numbers are positive, both are negative, or both are zero
    return ((num1 > 0 and num2 > 0) or
            (num1 < 0 and num2 < 0) or
            (num1 == num2))

numbers = [1, 2, -1, -2, 4, 5]
result = [[]] #list with one sublist ready
last_number = 0
for num in numbers:
    if same_direction(num, last_direction):
        # No need for a new sublist, put new number in last sublist
        result[-1].append(num)
    else:
        # trend changed, new sublist and put the number in it
        result.append([num])

這就是我想出的。 它接近您所擁有的內容,但更易於閱讀。 我避免過多地增加索引計數器i數量,這可能是您出錯的地方。

n= [1,2,-1,-2,4,5]
out=[]
i=1
tmp=[n[0]]
while i < len(n):
        if n[i] >= 0 and tmp[-1] >= 0:
                tmp.append(n[i])
        elif n[i] < 0 and tmp[-1] < 0:
                tmp.append(n[i])
        else:
                out.append(tmp)
                tmp = [n[i]]
        i = i + 1
if len(tmp) > 0: # typo fix was > 1
        out.append(tmp)

print(out)

這是我的解決方案:

numbers = [1,2,-1,-2,4,5, 3, 2]

subset = []
subset_list = []
subset.append(numbers[0])


forward = 1

for i in range(0, len(numbers) - 1):
    if ( forward == 1 ):
        if numbers[i] <= numbers[i+1]:
            subset.append(numbers[i+1])
        else:
            subset_list.append(subset)
            subset = []
            subset.append(numbers[i+1])
            forward = 0
    else:
        if numbers[i] >= numbers[i+1]:
            subset.append(numbers[i+1])
        else:
            subset_list.append(subset)
            subset = []
            subset.append(numbers[i+1])
            forward = 1

subset_list.append(subset)

print(*subset)          
print(*subset_list)

不幸的是,我的系統上只有python 3,所以我的答案是python 3。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM