Python大列表操作

2024-10-03 00:31:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有如下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]}]]

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

目前我是这样做的this。在

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

^{pr2}$

你知道我怎么做吗?在

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


Tags: 元素列表datademo解决方案manuallistaverage
3条回答

在Python中,每当你开始计算iterable(一个字符串、一个列表、一个集合、这些元素的集合)中有多少个,以便循环遍历它——这表明你的代码可以修改。在

东西可以为3件东西工作,也可以为300、3000和300万件同样的事情工作,而不需要更改代码。在

在您的例子中,您的逻辑是-“对于X内的每一个DEMO_LIST,做一些“

翻译成Python是:

for i in DEMO_LIST:
   # do something with i

此代码段将遍历任何大小的DEMO_LIST,并且每次iDEMO_LIST中的每一个。在您的例子中,是包含您的词典的列表。在

进一步扩展,你可以说:

^{pr2}$

{cd6>展开一个实用的例子:

^{3}$

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

记住,把它写出来“漫长的路”没有什么错,尤其是当你不确定做某事的最佳方式时。一旦您熟悉了逻辑,那么就可以使用诸如列表理解之类的快捷方式。在

您可以为自己实现一个特定的列表类,在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)

还有一个简单的用法:

^{pr2}$

从替换这个开始:

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

有了这个:

^{pr2}$

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

更“Python”的[*]版本:

^{3}$

是:

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

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

  • values()[0]可能会给您字典中的任何值,因为字典是无序的。也许它碰巧给了你未加权的数据,也许没有。在
  • 我搞不懂为什么要在0到len(data_list)-1范围内循环:如果你想包括所有你需要的运动0到{},因为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”代替,而不改变句子的意思;—)

相关问题 更多 >