Python大列表操作
我的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
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)