将相似范围的数字组合在一起的功能?

时间:2019-04-01 00:34:15

标签: python math

我有一个数字列表,我想根据它们彼此之间的接近程度将它们分成不同的组

List1=[1.8, 1.1, 1.9, 11, 9, 10, 36, 39, 44, 20]

当我查看此列表时,我立即知道有4组数字,前3组归为一组,下3组归为一组,下3组归为一组,最后一组(20)属于在自己的一群。我不确定自己的操作方式,但我认为其他人可能会同意我的看法

我在脑海中做什么以确定这一点?在python中有执行此操作的功能吗?

2 个答案:

答案 0 :(得分:0)

此刻很混乱而且很长,但是我相信这可以实现您想要的:

def define_groups(l, threshold = .4):
    groups = {}
    its = 0
    for i in l:
        numbers_except = list(l)
        del numbers_except[(l.index(i))]
        for x in range(len(numbers_except)):
            if percentage_diff(i, numbers_except[x]) < threshold:
                try:
                    groups[its].append(numbers_except[x])
                except:
                    groups[its] = [numbers_except[x]]
                del l[l.index(numbers_except[x])]
        try:
            groups[its].append(i)
        except:
            groups[its] = [i]
        its += 1
    print(groups)

def percentage_diff(a, b):
    return abs(abs(a-b)) / max([a,b])

In [0]: define_groups([1.8, 1.1, 1.9, 11, 9, 10, 36, 39, 44, 20]) {0: [1.1, 1.9, 1.8], 1: [9, 10, 11], 2: [39, 44, 36], 3: [20]}

可以很容易地修改阈值量,使其仅包括值的变化,但是从较低的数字到较高的值,它就不成比例,并且会创建与您描述的方式不匹配的组。这就是为什么我使用百分比更改检查的原因。

答案 1 :(得分:0)

您的示例数据和直觉符合以下规则:“两个值在同一组中,如果它们之间的距离不超过整个组中值之间的平均距离的1个标准差。”

以下代码表示相同:

from statistics import stdev

# sort the data, for simplicity
data = sorted([1.8, 1.1, 1.9, 11, 9, 10, 36, 39, 44, 20])

# create a list of the gaps between the consecutive values
gaps = [y - x for x, y in zip(data[:-1], data[1:])]
# have python calculate the standard deviation for the gaps
sd = stdev(gaps)

# create a list of lists, put the first value of the source data in the first
lists = [[data[0]]]
for x in data[1:]:
    # if the gap from the current item to the previous is more than 1 SD
    # Note: the previous item is the last item in the last list
    # Note: the '> 1' is the part you'd modify to make it stricter or more relaxed
    if (x - lists[-1][-1]) / sd > 1:
        # then start a new list
        lists.append([])
    # add the current item to the last list in the list
    lists[-1].append(x)

print(lists)

输出为:

[[1.1, 1.8, 1.9], [9, 10, 11], [20], [36, 39, 44]]

我假设排序顺序并不重要。

要在评论中回答我自己的问题,如果您将15和25相加,结果为:

[[1.1, 1.8, 1.9], [9, 10, 11], [15], [20], [25], [36, 39], [44]]

请注意,在将15和25相加后,标准偏差发生了变化,因此44也被分成了自己的小组。如果您添加17,它将变为:

[[1.1, 1.8, 1.9], [9, 10, 11], [15, 17, 20], [25], [36, 39], [44]]

或者,如果您不添加17,而是要求距离不超过1.6 SD:

[[1.1, 1.8, 1.9], [9, 10, 11, 15, 20, 25], [36, 39, 44]]