python - 形成嵌套列表并计算字段总和
问题描述
记录以这种形式存储在数据库中:
俱乐部 | 姓名 | 一个 | b |
---|---|---|---|
q | 一 | 7 | 6 |
q | 二 | 6 | 9 |
q | 五 | 6 | 10 |
e | 三 | 8 | 7 |
e | 四 | 10 | 4 |
我正在编写一个函数,它将计算不同 clu 变量(例如 q 和 e)的给定值的总和。也就是说,首先确定 name 的哪些值对应于 e 的值(它们是 3 和 4)。然后是对字典“e_dict”的呼吁,它存储了与不同名称对应的某些值。该函数应确定对于组 e 有必要将“名称”键 3 和 4 的值相加并给出结果。
字典 e_dict 的示例:
{'one': {'u_mean': 4.25, 'c_mean': 4.25}, 'three': {'u_mean': 4.5, 'c_mean': 4.5}, 'two': {'u_mean': 4.583333333333334, 'c_mean': 4.583333333333334}, 'four': {'u_mean': 4.5625, 'c_mean': 4.5625}, 'five': {'u_mean': 4.65, 'c_mean': 4.65}}
结果应该是这样的:
{'e': {'u_mean': 4.531, 'c_mean': 4.531}, 'q': {'u_mean': 4.49443, 'c_mean': 4.49443}}
也就是字段都是u_mean,求平均值,也相加。
我的函数的完整代码:
def group_names():
st, c_clus, n_names = [], [], []
for h in Utilizations.objects.values('clu', 'name', 'a', 'b'):
st.append((h.get('clu'), h.get('name'), h.get('a'), h.get('b')))
c_clus.append(h.get('clu'))
n_names.append(h.get('name'))
"""получение названий"""
names, clus = [], []
for nam in n_names:
if nam not in names:
names.append(nam)
for cl in c_clus:
if cl not in clus:
clus.append(cl)
clu, e = {}, {}
u_load, u_max = {}, {}
mean_all, u_load_mean, u_max_mean = 0, 0, 0
for nam in names:
hs = Utilizations.objects.filter(name=nam)
o, p = 0, 0
for h in hs:
o += h.a
p += h.b
u_load[nam] = o / 2 + 1
u_max[nam] = p / 2 + 1
u_max_mean = mean(u_max.values())
u_load_mean = mean(u_load.values())
mean_all = (u_max_mean + u_load_mean) / 2
e[nam] = {'u_mean': mean_all, 'c_mean': mean_all}
for cl in clus:
for nam in names:
s = Utilizations.objects.filter(name=nam, clu=cl)
for h in hs:
clu[nam] = cl
return clu
结果以这种形式分组:{'one': 'q', 'two': 'q', 'five': 'q', 'three': 'e', 'four': 'e'}
而且我不知道下一步该怎么做(
解决方案
我不知道您的原始数据是如何存储的(我不认识“Utilizations.objects.values”),但这里的代码将根据一个简单的列表列表计算这些平均值:
data = [
['q','one',7,6],
['q','two',7,6],
['q','five',7,6],
['e','three',7,6],
['e','four',7,6]
]
e_dict = {
'one': {'u_mean': 4.25, 'c_mean': 4.25},
'three': {'u_mean': 4.5, 'c_mean': 4.5},
'two': {'u_mean': 4.583333333333334, 'c_mean': 4.583333333333334},
'four': {'u_mean': 4.5625, 'c_mean': 4.5625},
'five': {'u_mean': 4.65, 'c_mean': 4.65}
}
def group_names():
sums = {}
counts = {}
for h in data:
if h[0] not in sums:
sums[h[0]] = { "u_mean": 0, "c_mean": 0 }
counts[h[0]] = 0
for k,v in e_dict[h[1]].items():
sums[h[0]][k] += v
counts[h[0]] += 1
for k,v in sums.items():
sums[k]['u_mean'] /= counts[k]
sums[k]['c_mean'] /= counts[k]
return sums
print(group_names())
输出:
{'q': {'u_mean': 4.4944444444444445, 'c_mean': 4.4944444444444445}, 'e': {'u_mean': 4.53125, 'c_mean': 4.53125}}
推荐阅读
- node.js - Node.js localhost to live server
- flutter - How to deal with different countdown in listview
- flutter - Flutter Bluetooth Serial Discovery - canceling discovery (stream closed)
- regex - Processing log file using Regex
- clojurescript - Pattern for Displaying Errors To UI In Reagent/Clojurescript
- centos7 - Postgresql unlogged tables after server shutdown cause of electricity
- android - Failed to extract manifest from APK: ProcessException: %1 is not a valid Win32 application - flutter
- r - Rstudio does not turn to dark theme for right panes on Mac; Tried all fonts and themes
- javascript - How to change text in text area with React Hooks?
- javascript - Outlook 插件上传 FileReference 作为附件