簡體   English   中英

字典列表 - 查找值的計數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM