遍历代码长度不清楚

时间:2019-07-19 19:00:47

标签: python list for-loop

我有一个python数据集作为列表,其中列表中的每个单独条目都是另一个包含x和y值的列表。我试图在不同的x值(存储在另一个列表中)中计算所有y的均值。

data_set = [[1,25],[1,30],[1,35],[1,40],[1,45]
           ,[2,35],[2,40],[2,44],[2,50],[2,55],[2,58]
           ,[3,49],[3,54],[3,60],[3,64],[3,68]
           ,[4,50],[4,63],[4,65],[4,73],[4,78],[4,83],[4,85]
           ,[5,72],[5,77],[5,80],[5,86],[5,88],[5,95]]

但是我无法让代码遍历整个数据集。

def prf_mean(list):
    mean_list = []
    temp_list = []


    counter = 1
    for i in list:

        if i[0]==counter:
            temp_list.append(i) 
        else:
            temp_var = 0
            for i in temp_list:
                temp_var +=i[1]

            mean_list.append(temp_var / len(temp_list))
            temp_list.clear()
            counter += 1

    return (mean_list)


prf_mean(data_set)

代码为x = 1提供了准确的均值,但是对于更高的x,结果是错误的(因为它们被错误的数字除以),并且x = 5完全没有显示。

4 个答案:

答案 0 :(得分:1)

我建议使用字典作为此问题的数据结构。下面的示例将您的data_set转换为字典,然后为每个x计算平均值y。

ByteArrayOutputStream boas = new ByteArrayOutputStream();
WritableByteChannel output = Channels.newChannel(new DataOutputStream(boas));
UnparseResult result = dataProcessor.unparse(inputter, output);
System.out.println(boas.toString());

答案 1 :(得分:0)

如果您对项目进行排序(或者如果您可以依靠它们现在的排序方式),则可以使用itertools.groupby将其分组为基于x值的单位。然后只需找到每个组的平均值即可:

from itertools import groupby

data_set = [[1,25],[1,30],[1,35],[1,40],[1,45]
           ,[2,35],[2,40],[2,44],[2,50],[2,55],[2,58]
           ,[3,49],[3,54],[3,60],[3,64],[3,68]
           ,[4,50],[4,63],[4,65],[4,73],[4,78],[4,83],[4,85]
           ,[5,72],[5,77],[5,80],[5,86],[5,88],[5,95]]

for k, g in groupby(sorted(data_set), key=lambda x: x[0]):
    n = [x[1] for x in g]
    av = sum(n)/len(list(n))
    print (f"{k} average: {av}")

此打印:

1 average: 35.0
2 average: 47.0
3 average: 59.0
4 average: 71.0
5 average: 83.0

因为groupby是一个迭代器,所以如果您的数据已经排序,则有可能无需在内存中保存整个数据集就可以计算均值,如果数据集很大的话(例如从磁盘读取数据)就很好了。

答案 2 :(得分:0)

这是另一种方式。

data_set = [[1,25],[1,30],[1,35],[1,40],[1,45]
           ,[2,35],[2,40],[2,44],[2,50],[2,55],[2,58]
           ,[3,49],[3,54],[3,60],[3,64],[3,68]
           ,[4,50],[4,63],[4,65],[4,73],[4,78],[4,83],[4,85]
           ,[5,72],[5,77],[5,80],[5,86],[5,88],[5,95]]

all_means = {}
for i in range(1, 6):
    means = []
    for j in data_set:
        if j[0] == i:
            means.append(j[1])
    all_means[i] = sum(means) / len(means)

print(all_means)

输出:

{1: 35.0, 2: 47.0, 3: 59.0, 4: 71.0, 5: 83.0}

答案 3 :(得分:0)

这是功能编程方式:

data_set = [[1,25],[1,30],[1,35],[1,40],[1,45]
           ,[2,35],[2,40],[2,44],[2,50],[2,55],[2,58]
           ,[3,49],[3,54],[3,60],[3,64],[3,68]
           ,[4,50],[4,63],[4,65],[4,73],[4,78],[4,83],[4,85]
           ,[5,72],[5,77],[5,80],[5,86],[5,88],[5,95]]

f = lambda arg, n: list(map(lambda k: list(map(lambda j: j[1], 
    list(filter(lambda i: i[0] == k, arg)))), range(1, n + 1)))

for i in f(data_set, 5):
    print(sum(i) / len(i))

输出:

35.0
47.0
59.0
71.0
83.0