Vesper
Vesper

Reputation: 845

how to count negative and positive numbers in each set from a list?

I have list which contains 30 numbers

list = [-21,-22,-33,-55,-454,65,48,-516,614,6,2,-64,-64,-87,6,45,87,15,11,03,-34,-6,-68,-959,-653,24,658,68,9,-2181]

Now first I want to count the number of continuous 3 positive or negative numbers. For that I am using this program:

list = [-21,-22,-33,-55,-454,65,48,-516,614,6,2,-64,-64,-87,6,45,87,15,11,03,-34,-6,-68,-959,-653,24,658,68,9,-2181]
counts = []
count = 0

daysCounter = 1
plus_counter = 0
minus_counter = 0
row_counter = 0
answer_counter = 1

for each in list: # for the "dev column"
    if each > 0:
        minus_counter = 0
        plus_counter += 1

        if plus_counter == 3:
            count = answer_counter
            row_counter = answer_counter
            counts.append(count)
            plus_counter = 0
            answer_counter += 1

        else:
            counts.append(0)

    elif each < 0:
        plus_counter = 0
        minus_counter += 1

        if minus_counter == 3:
            count = answer_counter
            row_counter = answer_counter
            counts.append(count)
            minus_counter = 0
            answer_counter += 1
        else:
            counts.append(0)

    row_counter += 1

print counts

output:

[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, 0, 0, 4, 0, 0, 5, 0, 0, 6, 0, 0, 0, 0, 7, 0, 0]

This is correct but I want to reset the counter at %10 == 0position. Basically, if the list contains 30 elements then I want to count between 0 to 10th element then 11th to 20th then 21th to 30th element. desired output:

[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0]

Upvotes: 1

Views: 247

Answers (3)

Fahad Yamin
Fahad Yamin

Reputation: 49

I think the above desired output you post is not correct

Add this code in the end, This code will reset between 0th to 9th, 10th to 19,20th to 29 elements of a list.

list_len = len(counts)
total_multiple = int(list_len/10)

for i in range(1, total_multiple):

    count = 0
    for j in range(10*i, 10*i+10):

        if(counts[j] > 0):
            counts[j] = count
            count += 1
print(counts)

It will modify your list and prints

[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0]

Upvotes: 1

Chris Doyle
Chris Doyle

Reputation: 12040

Your question didnt make sense to me, you say you want to reset on every module 10 index, yet you then go on to say in a list of 30 elements you want

  • 0 to 10 (this is 11 elements)
  • 11 to 20 (this is 10 elements)
  • 21 to 30 (this is 10 elements)

The total of this would be 31 elements but you said your list has 30 elements. which would be indexed from 0 to 29. So i have made an assumption here that you do mean every 10 elelemts I.E 0 to 9, 10 to 19, 20 to 29. This makes my output out of line with yours but again i can only make an assumption here that you miscounted with your indexes.

nums = [
    -21, -22, -33, -55, -454, 65, 48, -516, 614, 6,
    2, -64, -64, -87, 6, 45, 87, 15, 11, 3,
    -34, -6, -68, -959, -653, 24, 658, 68, 9, -2181
]

nths = 10
sequential_limit = 3
sequential_count = sequential_finds = 0
indexer = sequential_limit - 1
sequential_list = [0 for _ in range(indexer)]
skip = 0

for index, num in enumerate(nums[indexer:], indexer):
    result = 0
    if index % nths == 0:
        sequential_count = sequential_finds = 0
        skip = indexer
    if skip:
        skip -= 1
    else:
        negative = sum(1 for next_num in nums[index - indexer:index + 1] if next_num < 0)
        positive = sum(1 for next_num in nums[index - indexer:index + 1] if next_num >= 0)
        if sequential_limit in (positive, negative):
            sequential_finds += 1
            sequential_count = 0
            skip = indexer
            result = sequential_finds
    sequential_list.append(result)

print(sequential_list)

OUTPUT

[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 3, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0]

Upvotes: 1

Austin
Austin

Reputation: 26039

Basically, you will have to reset to default values for each period:

# other code
for i, each in enumerate(list): # for the "dev column"
    if i % 10 == 0:
        count = 0
        daysCounter = 1
        plus_counter = 0
        minus_counter = 0
        row_counter = 0
        answer_counter = 1
    # remaining code

Note: You should not name your list as list, because you override the built-in.

Upvotes: 3

Related Questions