如何使用字典获取感兴趣范围内的索引,以便我可以在这些索引处切割多个列表?

时间:2017-06-07 05:50:50

标签: python-3.x dictionary indexing collections counter

我正在尝试计算索引以在大量数据中找到感兴趣的区域。这样,我可以在适当的索引处使用切片表示法来获得快速性能。我最初尝试使用.count()方法,但我现在正在尝试使用字典模块。例如,我创建了一个txt文件并获取了值的出现次数。如何使用它来计算感兴趣范围内的指数?

简单示例:

txt文件包含以下数据。

1     100       1       
1     101       2
1     102       3
2     103       4
2     104       5
3     105       6
3     106       7
3     107       8
3     108       9
4     109       10
5     110       11

我使用下面的两个函数来读取文件并将数据组织到适当的列表中。

def get_list_from_int(lines, col_number):
    list = []
    for col in lines:
        datum = col.split()
        list.append(float(datum[col_number]))
    return list

def read_data(filename): # filename = "User/Desktop/fileloc/filename.txt"
    lines = list(open(filename, 'r'))
    xs = get_list_from_int(lines, 0) # column 1
    ys = get_list_from_int(lines, 1) # column 2
    zs = get_list_from_int(lines, 2) # column 3
    return xs, ys, zs

然后我通过Counter模块使用collections

X = Counter(xs)
print(X)
>> Counter({3.0: 4, 1.0: 3, 2.0: 2, 4.0: 1, 5.0: 1})

问题: 假设我想要3 ≤ xs ≤ 4的索引。我可以应用切片表示法来获得相应yszs的相同索引。如何获得大于或等于3但小于或等于4的键的值之和?理想情况下,获得的结果为[6, 10],但[6, 7, 8, 9, 10]也可以。

原创方法(值得放弃?): 我最初的方法是使用define一个函数来计算从列表的第一个元素到感兴趣范围的第一个元素的索引,然后继续计数直到感兴趣的范围中的最后一个元素;该函数将使用start += data_list.count(index) for index in range(1, boundary_1)end += data_list.count(index) for index in range(boundary_1, boundary_2+1)将感兴趣范围的边界元素作为输入,但我无法使函数正常工作。

1 个答案:

答案 0 :(得分:0)

def choose_slice(start, end, xs):
    # subfunction called by get_slice() -- defined below
    go, stop = 0, 0
    cx = sorted(Counter(xs).items()) # sort to count consecutively
    for val, key in cx:
        if val < start:
            go += key # match index at boundary of region of interest
            # print("count = %d" %key, "value = %.2f" %val)
        elif val >= start and val <= end:
            stop += key # inbetweeen the boundaries, in the region of interest
            # print("count = %d" %key, "value = %.2f" %val)
        elif val > end: # match index at boundary of region of interest
            break
    stop = go + stop
    return go, stop

def get_slice(start, end, xs=xs, ys=ys, zs=zs):
    go, stop = choose_slice(start, end, xs) # get indices
    return xs[go:stop], ys[go:stop], zs[go:stop] # get values at indices

xx, yy, zz = get_slice(3, 4)
print(xx)
>> [3.0, 3.0, 3.0, 3.0, 4.0] 

这适用于我的数据集大小~10 ^ 4。但我仍然对其他方法感到好奇。