将多个范围应用于一个列表

时间:2017-07-28 16:29:47

标签: python

我试图循环遍历需要按范围排序的长数据列表,然后我需要计算每个范围内的整数。如果您连续输入范围,即0-101,100-201,200-301等,以下代码有效。 有没有办法编写这段代码,以便我不必输入每个范围?

import collections 
first_range = [ ] 
f = open("numbers.txt")
count1 = collections.Counter()
for line in f:
    for number in line.split():
        count1.update((number,))
        if number > '0' and number < '101':
            first_range.append(number)
print(len(first_range))

来自number.txt的示例数据: [209,166,38]

预期产量: 0-101 = x 100-201 = y 等。

4 个答案:

答案 0 :(得分:0)

保持上限,在排序列表中迭代,当数量超过绑定增加100的限制时

import random
lisst = [209, 166, 38, 1090, 1091, 1092, 1099, 2011]
cnts = []
cnt = 0
up = 100
for num in sorted(lisst):
    if num <= up:
        cnt+=1
    else:
        while num > up:
            cnts.append(cnt)
            cnt=0
            up+=100
        cnt=1
cnts.append(cnt)
for i in range(len(cnts)):
    print(str(i*100+1) + "-" + str(i*100+100) + " = " + str(cnts[i]))

答案 1 :(得分:0)

您可以使用整数除法将数字分成范围,然后使用整数除法中的值将值放入列表中,这样:

from collections import defaultdict

nums = [10, 50, 210, 300, ...]
bin_sort = defaultdict([])

for num in nums:
    bin_sort[num//100].append(num)

bin_sort将包含您需要组织的所有值,以及您所使用的范围增量。因此,要获得0-100 bin,您将打印出来:

>>>print(bin_sort[1])
[10, 50, ...]

对于这类事情(Algorithms for bucket sort

,还值得一试。

答案 2 :(得分:0)

另一种可能的迭代解决方案:

import math

with open('numbers.txt', 'r') as f:
    numbers = [int(x) for x in f.readlines()]
    ranges = math.ceil(max(numbers) / 100)

    for r in range(ranges):
        bottom = r * 100
        top = bottom + 101
        range_count = [num for num in numbers if num in range(bottom, top)]
        print('Number in Range {}: {}'.format(r, len(range_count)))

答案 3 :(得分:0)

这应该适合您,不需要像collections

这样的外部库
ranges = { # (start, end): [count, [number list]]
(0, 101): [0, []],
(101, 201): [0, []],
(201, 301): [0, []]
}

with open('numbers.txt', 'r') as f:
    for line in f.readlines():
        numbers = [int(n) for n in line.split()]
        for num in numbers:
            for start, end in ranges.keys():
                if start <= num < end:
                    ranges[(start, end)][0] += 1
                    ranges[(start, end)][1].append(num)

for range_ in ranges.keys():
    print("{}-{}: {}".format(range_[0], range_[1], ranges[range_][0]))