正在分析和计算 Python3 列表列表中的新值

Analysing and calculating new values in list of lists in Python3

好吧,我会尽量正确地解释自己:

我正在使用 python3 结构中的列表列表:

[[position, color, counts],...]

结果按颜色先排序,再按位置排序。

如果它们具有相同的颜色并且它们之间的位置最多为 +-2,我需要合并位置的计数和平均值。

一个简短的输入测试示例是:

[ [1, "red", 3],  [2, "red", 2],  [3, "red", 3], [5, "red", 1], [3, "green", 9],  [10, "green", 4] ]

预期输出:

[ [2.75, "red", 9], [3, "green", 9], [10, "green", 4]

我对 5 "red" 1 这样的情况特别有问题,因为如果我工作执行平均距离可以增加,但我想考虑它的实际情况前一个的2个位置...

有解决办法吗?

提前致谢!

这是一个可行的方法:

list = [ [1, "red", 3], [2, "red", 2], [3, "red", 3], [5, "red", 1], [3, "green", 9], [10, "green", 4], [5, "green", 7], [2, "blue", 3], [4, "blue", 7] ]
color = list[0][1]
result_list = []

sum1, sum2 = 0, 0
count = 0
avg = 0

for item in list:
    if color != item[1]:
        avg = float(sum1)/float(count)
        result_list.append([avg, color, sum2])
        count = 1
        color = item[1]
        sum1, sum2 = item[0], item[2]
    else:
        count += 1
        sum1 += item[0]
        sum2 += item[2]

avg = float(sum1)/float(count)
result_list.append([avg, color, sum2])

print result_list

还有一个Fiddle

我想我答对了你的问题。这个片段应该可以工作,但它可能是可优化的:

colors = [ [1, "red", 3], [2, "red", 2], [3, "red", 3], [5, "red", 1], [3, "green", 9], [10, "green", 4] ]

def avg(list): 
    return sum(list) / float(len(list))

def process(colors, threshold=2): 
    colors_combined = {}
    colors_processed = []

    # sort colors by their name
    for color in colors: 
        position, color_name, count = color

        if color_name not in colors_combined.keys(): 
            colors_combined[color_name] = []

        colors_combined[color_name].append([position, count])

    # print colors_combined

    # process the data
    for color in colors_combined.keys(): 
        data = colors_combined[color]

        if len(data) == 1: # there can't be a case, where len(data) = 0
            colors_processed.append([data[0], color, data[1]])
        else: # more than 1 positions to check
            last_position = data[0][0]
            positions = [last_position]
            count_combined = data[0][1]

            for element in data[1:]: 
                if abs(last_position - element[0]) <= threshold: # element is inside of the distance
                    positions.append(element[0])
                    count_combined += element[1]
                else: 
                    colors_processed.append([avg(positions), color, count_combined])
                    positions = [element[0]]
                    count_combined = element[1]

                last_position = element[0]

            if len(positions) > 0: # the last processed elements where inside the distance, but not added
                colors_processed.append([avg(positions), color, count_combined])

    return colors_processed

print process(colors)

输出如下所示:

[[3.0, 'green', 9], [10.0, 'green', 4], [2.75, 'red', 9]]

如果您需要排序的结果,您可以添加颜色排序而不是 colors_combined.keys()