Python大列表操作

Python大列表操作,python,algorithm,data-structures,Python,Algorithm,Data Structures,我的python列表如下所示: DEMO_LIST = [ [{'unweighted_criket_data': [-46.14554728131345, 2.997789122813151, -23.66171024766996]}, {'weighted_criket_index_input': [-6.275794430258629, 0.4076993207025885, -3.2179925936831144]}, {'manual_weighted_cr

我的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
你知道我怎么做吗


(对于初学者的问题,很抱歉)

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

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

首先,替换以下内容:

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]
是:

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

  • values()[0]
    可能会提供字典中的任何值,因为字典是无序的。也许它碰巧给了你未加权的数据,也许不是
  • 我不明白为什么要在0到
    len(数据列表)-1范围内循环:如果要包括
    0
    len(数据列表)
    所需的所有运动,因为
    范围的第二个参数,即上限被排除
也许你可以考虑重新格式化你的数据:

DEMO_LIST = {
    'cricket' : {
        'unweighted' : [1,2,3],
        'weighted' : [4,5,6],
        'manual' : [7,8,9],
        'average' : [10,11,12],
    },
    'rugby' : ...
}
一旦你在每项运动的字典中都有相同的键,你就可以用
['unweighted']
替换
values()[0]
,这样你就总能得到正确的字典条目。一旦有了一大堆具有相同键的字典,就可以用类或命名元组替换它们,以定义/强制这些值必须始终存在:

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”替换,而不改变句子的意思;-)

在Python中,每当您开始计算一个iterable(一个字符串、一个列表、一个集合、其中任何一个的集合)中有多少内容,以便在其上循环时,这表明您的代码可以修改

东西可以为3件东西工作,可以为300、3000和300万件同样的东西工作,而无需更改代码

在您的情况下,您的逻辑是“对于
X
内的
DEMO\u列表
,做点什么”

翻译成Python的代码是:

for i in DEMO_LIST:
   # do something with i
此代码段将遍历任何大小的
DEMO\u列表
,每次
i
都是
DEMO\u列表
中的任何内容。在您的情况下,它是包含词典的列表

进一步扩展,你可以说:

   for i in DEMO_LIST:
      for k in i:
         # now you are in each list that is inside the outer DEMO_LIST
将此扩展为一个实际示例;所有
未加权数据的总和

   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)
有各种各样的“捷径”可以做同样的事情,但是一旦你理解了“扩展”版本的捷径所要做的事情,你就可以欣赏它们了


记住,写下“漫长的路”并没有错,尤其是当你不确定做某事的最佳方式时。一旦你熟悉了逻辑,你就可以使用快捷方式,比如列表理解。

你能详细说明一下吗?在附加了它之后,你会在代码中更改数据吗?如果这是真的,那么每件事都会变得更难。但是在append and Remove中,它和我编写的代码一样简单(我已经修复了代码,请重新检查)。
   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)