0

我有如下 python 列表:

DEMO_LIST = [
    [{'unweighted_criket_data': [-46.14554728131345, 2.997789122813151, -23.66171024766996]},
     {'weighted_criket_index_input': [-6.275794430258629, 0.4076993207025885, -3.2179925936831144]},
     {'manual_weighted_cricket_data': [-11.536386820328362, 0.7494472807032877, -5.91542756191749]},
     {'average_weighted_cricket_data': [-8.906090625293496, 0.5785733007029381, -4.566710077800302]}],

    [{'unweighted_football_data': [-7.586729834820534, 3.9521665714843675, 5.702038461085529]},
     {'weighted_football_data': [-3.512655913521907, 1.8298531225972623, 2.6400438074826]},
     {'manual_weighted_football_data': [-1.8966824587051334, 0.9880416428710919, 1.4255096152713822]},
     {'average_weighted_football_data': [-2.70466918611352, 1.4089473827341772, 2.0327767113769912]}],

    [{'unweighted_rugby_data': [199.99999999999915, 53.91020408163265, -199.9999999999995]},
     {'weighted_rugby_data': [3.3999999999999857, 0.9164734693877551, -3.3999999999999915]},
     {'manual_rugby_data': [49.99999999999979, 13.477551020408162, -49.99999999999987]},
     {'average_weighted_rugby_data': [26.699999999999886, 7.197012244897959, -26.699999999999932]}],

    [{'unweighted_swimming_data': [2.1979283454982053, 14.079951031527246, -2.7585499298828777]},
     {'weighted_swimming_data': [0.8462024130168091, 5.42078114713799, -1.062041723004908]},
     {'manual_weighted_swimming_data': [0.5494820863745513, 3.5199877578818115, -0.6896374824707194]},
     {'average_weighted_swimming_data': [0.6978422496956802, 4.470384452509901, -0.8758396027378137]}]]

我想操作列表项并进行一些基本的数学运算,例如获取每个数据类型列表(例如获取未加权数据的所有第一个元素并求和等)

目前我正在这样

当前的解决方案是一个非常基本的解决方案,我想这样做,如果列表长度增加,它可以自动计算结果。现在有四个列表,可以是5或8,最终结果应该是所有未加权值的第一个元素的总和,例如:

now I am doing result_u1/4,result_u2/4,result_u3/4
I want it like result_u0/4,result_u1/4.......result_n4/4 # n is the number of list inside demo list

知道我该怎么做吗?

(对不起初学者的问题)

4

3 回答 3

0

您可以为自己实现一个特定的列表类,在 append 函数中添加带有新项目值的摘要,或者在删除时减少它们:

class MyList(list):
    def __init__(self):
        self.summary = 0
        list.__init__(self)

    def append(self, item):
        self.summary += item.sample_value
        list.append(self, item)

    def remove(self, item):
        self.summary -= item.sample_value
        list.remove(self, item)

还有一个简单的用法:

my_list = MyList()
print my_list.summary  # Outputs 0
my_list.append({'sample_value': 10})
print my_list.summary # Outputs 10
于 2012-08-22T10:17:52.053 回答
0

首先替换这个:

for i in range(0,len(data_list)-1):
    result_u1+=data_list[i][0].values()[0][0]
    result_u2+=data_list[i][0].values()[0][1]
    result_u3+=data_list[i][0].values()[0][2]
print "UNWEIGHTED",result_u1/4,result_u2/4,result_u3/4

有了这个:

sz = len(data_list[i][0].values()[0])
result_u = [0] * sz
for i in range(0,len(data_list)-1):
    for j in range(0,sz):
        result_u[j] += data_list[i][0].values()[0][j]
print "UNWEIGHTED", [x/len(data_list) for x in result_u]

在其他地方应用类似的更改。这假设您的数据确实是“矩形”,也就是说每个相应的内部列表都具有相同数量的值。

稍微更“Pythonic”[*] 的版本:

for j in range(0,sz):
    result_u[j] += data_list[i][0].values()[0][j]

是:

for j, dataval in enumerate(data_list[i][0].values()[0]):
    result_u[j] += dataval

但是,您的代码存在一些问题:

  • values()[0]可能会给您字典中的任何值,因为字典是无序的。也许它恰好给你未加权的数据,也许不是。
  • 我很困惑为什么你要在 0 到 的范围内循环len(data_list)-1:如果你想包括所有你需要的运动0len(data_list)因为第二个参数 to range,上限,被排除在外

您也许可以考虑像这样重新格式化您的数据:

DEMO_LIST = {
    'cricket' : {
        'unweighted' : [1,2,3],
        'weighted' : [4,5,6],
        'manual' : [7,8,9],
        'average' : [10,11,12],
    },
    'rugby' : ...
}

一旦你在每项运动的字典中有相同的键,你可以用 替换values()[0]['unweighted']这样你总是能得到正确的字典条目。并且一旦您拥有大量具有相同键的字典,您可以将它们替换为类或命名元组,以定义/强制这些值必须始终存在:

import collections
Sport = collections.namedtuple('Sport', 'unweighted weighted manual average')
DEMO_LIST = {
    'cricket' : Sport(
        unweighted = [1,2,3],
        weighted = [4,5,6],
        manual = [7,8,9],
        average = [10,11,12],
    ),
    'rugby' : ...
}

现在您可以替换['unweighted'].unweighted.

[*] “Pythonic”这个词的官方意思是“以 Python 程序员的风格完成,利用任何有用的 Python 特性来生成最好的惯用 Python 代码”。在实践中,它通常意味着“我更喜欢这个,而且我是一名 Python 程序员,因此这是编写 Python 的正确方法”。如果你是 Guido van Rossum,这是权威的争论,如果你不是,它是诉诸模糊的权威。在几乎所有情况下,它都可以替换为“good IMO”而不改变句子的含义;-)

于 2012-08-22T10:20:29.910 回答
0

在 Python 中,每当您开始计算可迭代对象(字符串、列表、集合、任何这些的集合)中有多少东西以循环遍历它时,这表明您的代码可以修改。

事情可以为 3 个东西工作,可以为 300、3000 和 300 万个相同的东西工作,而无需更改您的代码。

在您的情况下,您的逻辑是- “对于每个X内部DEMO_LIST,做某事”

这翻译成Python是:

for i in DEMO_LIST:
   # do something with i

此代码段将贯穿任何大小,DEMO_LIST并且每次i都是 side 中的每一个DEMO_LIST。在您的情况下,它是包含您的字典的列表。

进一步扩展,您可以说:

   for i in DEMO_LIST:
      for k in i:
         # now you are in each list that is inside the outer DEMO_LIST

扩展这个做一个实际的例子;总和unweighted_criket_data

   all_unweighted_cricket_data = []
   for i in DEMO_LIST:
       for k in i:
         if 'unweighted_criket_data' in k:
             for data in k['unweighted_cricket_data']:
                  all_unweighted_cricked_data.append(data)

   sum_of_data = sum(all_unweighted_cricket_data)

有各种“快捷方式”可以做同样的事情,但是一旦你理解了快捷方式试图做什么的“扩展”版本,你就会欣赏这些。

请记住,将其写出“很长的路”并没有错,尤其是当您不确定做某事的最佳方式时。一旦您对逻辑感到满意,您就可以使用列表推导等快捷方式。

于 2012-08-22T10:26:35.607 回答