[英]List of dictionaries - Find count of values
我很難實現這個邏輯。
這是輸入,字典列表
list = [
{"mne": "ABC", "appname": "abc1", "agentname": "abcagent1", "env": "dev"},
{"mne": "ABC", "appname": "abc1", "agentname": "abcagent2", "env": "uat"},
{"mne": "ABC", "appname": "abc1", "agentname": "abcagent3", "env": "prod"},
{"mne": "ABC", "appname": "abc2", "agentname": "abcagent4", "env": "dev"},
{"mne": "ABC", "appname": "abc2", "agentname": "abcagent5", "env": "prod"},
{"mne": "XYZ", "appname": "asf1", "agentname": "asfagent1", "env": "dev"},
{"mne": "XYZ", "appname": "asf2", "agentname": "asfagent2", "env": "prod"},
]
這是 output,我正在尋找:
[
{"mne": "ABC", "non_prod_app_count": 2, "prod_app_count": 2, "non_prod_agent_count": 3, "prod_agent_count": 2},
{"mne": "XYZ", "non_prod_app_count": 1, "prod_app_count": 1, "non_prod_agent_count": 1, "prod_agent_count": 1}
]
解釋:
non_prod (dev, uat)
prod (prod)
對於output中的第一個字典,這里是解釋。
non_prod_app_count = 2 (abc1, abc2)
prod_app_count = 2 (abc1, abc2)
non_prod_agent_count = 3 (abcagent1, abcagent2, abcagent4)
prod_agent_count = 2 (abcagent3, abcagent5)
您不應使用“列表”作為變量名。 Pandas 是一個可以在這里提供幫助的工具。 它體積龐大,但應該可以完成工作。
import pandas as pd
data = [
{"mne": "ABC", "appname": "abc1", "agentname": "abcagent1", "env": "dev"},
{"mne": "ABC", "appname": "abc1", "agentname": "abcagent2", "env": "uat"},
{"mne": "ABC", "appname": "abc1", "agentname": "abcagent3", "env": "prod"},
{"mne": "ABC", "appname": "abc2", "agentname": "abcagent4", "env": "dev"},
{"mne": "ABC", "appname": "abc2", "agentname": "abcagent5", "env": "prod"},
{"mne": "XYZ", "appname": "asf1", "agentname": "asfagent1", "env": "dev"},
{"mne": "XYZ", "appname": "asf2", "agentname": "asfagent2", "env": "prod"},
]
df = pd.DataFrame(data)
rows = []
for mne in df.mne.unique():
tmp_df = df[df['mne']==mne]
rows.append({
'mne':mne,
'non_prod_app_count': len(tmp_df[tmp_df['env']!= 'prod']['appname'].unique()),
'prod_app_count':len(tmp_df[tmp_df['env']=='prod']['appname'].unique()),
'non_prod_agent_count':len(tmp_df[tmp_df['env'].isin(['uat','dev'])]['agentname'].unique()),
'prod_agent_count':len(tmp_df[tmp_df['env']=='prod']['agentname'].unique()),
})
print(rows)
output:
[{'mne': 'ABC',
'non_prod_app_count': 2,
'prod_app_count': 2,
'non_prod_agent_count': 3,
'prod_agent_count': 2},
{'mne': 'XYZ',
'non_prod_app_count': 1,
'prod_app_count': 1,
'non_prod_agent_count': 1,
'prod_agent_count': 1}]
嘗試:
lst = [
{"mne": "ABC", "appname": "abc1", "agentname": "abcagent1", "env": "dev"},
{"mne": "ABC", "appname": "abc1", "agentname": "abcagent2", "env": "uat"},
{"mne": "ABC", "appname": "abc1", "agentname": "abcagent3", "env": "prod"},
{"mne": "ABC", "appname": "abc2", "agentname": "abcagent4", "env": "dev"},
{"mne": "ABC", "appname": "abc2", "agentname": "abcagent5", "env": "prod"},
{"mne": "XYZ", "appname": "asf1", "agentname": "asfagent1", "env": "dev"},
{"mne": "XYZ", "appname": "asf2", "agentname": "asfagent2", "env": "prod"},
]
mne = {}
for d in lst:
mne.setdefault(d["mne"], []).append(d)
out = []
for k, v in mne.items():
env = {}
for d in v:
env.setdefault(d["env"], []).append(d)
non_prod_app_count = set(
i["appname"] for k, v in env.items() for i in v if k != "prod"
)
prod_app_count = set(v["appname"] for v in env["prod"])
non_prod_agent_count = set(
i["agentname"] for k, v in env.items() for i in v if k != "prod"
)
prod_agent_count = set(v["agentname"] for v in env["prod"])
out.append(
dict(
mne=k,
non_prod_app_count=len(non_prod_app_count),
prod_app_count=len(prod_app_count),
non_prod_agent_count=len(non_prod_agent_count),
prod_agent_count=len(prod_agent_count),
)
)
print(out)
印刷:
[
{
"mne": "ABC",
"non_prod_app_count": 2,
"prod_app_count": 2,
"non_prod_agent_count": 3,
"prod_agent_count": 2,
},
{
"mne": "XYZ",
"non_prod_app_count": 1,
"prod_app_count": 1,
"non_prod_agent_count": 1,
"prod_agent_count": 1,
},
]
首先,您迭代字典列表並創建相應的字典來存儲不同的應用程序和代理。
然后,您迭代條目並將不同的名稱放入相應的列表中。
最后,計算您創建的列表的長度
apps = {}
for l in list:
app = l["mne"]
if app not in apps.keys():
apps[app] = {"mne": l["mne"],
"non_prod_app": [],
"prod_app": [],
"non_prod_agent": [],
"prod_agent": []}
for l in list:
app = l["mne"]
if l["env"] == "prod":
if l["appname"] not in apps[app]["prod_app"]:
apps[app]["prod_app"].append(l["appname"])
if l["agentname"] not in apps[app]["prod_agent"]:
apps[app]["prod_agent"].append(l["agentname"])
else:
if l["appname"] not in apps[app]["non_prod_app"]:
apps[app]["non_prod_app"].append(l["appname"])
if l["agentname"] not in apps[app]["non_prod_agent"]:
apps[app]["non_prod_agent"].append(l["agentname"])
returnList = []
for l in apps.values():
returnList.append({"mne": l["mne"],
"non_prod_app": len(l["non_prod_app"]),
"prod_app": len(l["prod_app"]),
"non_prod_agent": len(l["non_prod_agent"]),
"prod_agent": len(l["prod_agent"])})
謝謝@1extralime,@Peter T. Walker,@AndrejKesely。 您的所有 3 個解決方案都有效。 非常感謝您的及時回復。 我該如何評價你們三個? 我為您的所有 3 個解決方案單擊了向上按鈕。 它說我需要 15 聲望才能投票。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.