得到动作数

时间:2018-09-04 10:24:42

标签: python python-2.7 dictionary

我有嵌套的字典,如下所示

    public static boolean isLeapYear(int year){
        return isDivisible(1,year,100,year) ? isDivisible(1,year,400,year) : isDivisible(1,year,4,year);
    }

    private static boolean isDivisible(int low,int high,int divisor,int dividend){
        int mid = 0;
        while(low <= high){
            mid = low + ((high - low) >> 1);
            int result = divisor * mid;
            if(result == dividend) return true;
            else if(result > dividend) high = mid - 1;
            else low = mid + 1;
        }

        return false;
    }

我想要这样的每个动作计数 其中count =无重复

{'C_Charges': {'Id': {'action': 'added',
          'new': '##########',
          'old': 'Null'},
         'P_Code': {'action': 'added', 'new': '#####', 'old': 'Null'}},
        'C_Insurance': {'Id': {'action': 'added',
          'new': '#######',
          'old': 'Null'},
         'Ins. Mode': {'action': 'added', 'new': 'Primary', 'old': 'Null'}},
        'C_Status': {'P_Status': {'action': 'Changed',
          'new': 'Waiting',
          'old': 'Blank'},
         'P_Status': {'action': 'Changed', 'new': 'New', 'old': 'Blank'}},
        '[P_Code': 'None'}]},{'C_Status': {'P_Status': {'action': 'Changed',
      'new': 'Blank',
      'old': 'New'}},
    'PTL Status': {'PTL File No': {'action': 'Changed',
      'new': '1',
      'old': '01'},
     'PTL Scan Date': {'action': 'Changed',
      'new': '07/17/2018',
      'old': '07/07/2018'}}}, 

我是python的新手,所以您的帮助将是有益的,并且我也是stack-overflow的新手,因此,如果编辑错误请指导我

1 个答案:

答案 0 :(得分:0)

some_dictionary = {
    'C_Charges': {
        'Id': {'action': 'added','new': '##########','old': 'Null'},
        'P_Code': {'action': 'added', 'new': '#####', 'old': 'Null'}
    },
    'C_Insurance': {
        'Id': {'action': 'added','new': '#######','old': 'Null'},
        'Ins. Mode': {'action': 'added', 'new': 'Primary', 'old': 'Null'}
    },
    'C_Status': {
        'P_Status': {'action': 'Changed','new': 'Waiting','old': 'Blank'},
        'P_Status': {'action': 'Changed', 'new': 'New', 'old': 'Blank'},
        'P_Code': {'None':'None'},
        'PTL Status': {
            'PTL File No': {'action': 'Changed','new': '1','old': '01'}
        },
        'PTL Scan Date': {
            'action': 'Changed','new': '07/17/2018', 'old': '07/07/2018'
        }
    }
}

这是给使用此代码的任何人的,我试图格式化字典,由于不正确的括号,我不得不删除一些重复项并作一些假设。我认为我们仍然可以使用它来提出一个解决方案,该解决方案将在OP具有正确的字典设置后才能起作用。

如果OP可以仔细查看并评论缺少或不想要的内容,我将进行更新。

假设在这里,OP希望找到action唯一的所有value,因此我们将试图将addedChanged拼凑起来,任何人都可以随意鸣叫。

解决方案

for k, v in some_dictionary.items():
    for a, b in v.items():
        if k == 'C_Status' and a == 'P_Code':
            continue
        elif a != 'PTL Status':
            status = [v for k, v in b.items() if k == 'action']
            status = ''.join(status)
            name = f"{k}: {a}: {status}" 
            actions = []
            actions.append(b.get('action'))
            actions = set(actions)
            count = 0
            for i in actions:
                count += 1
            print(f"{name}: counts: {count}")
        elif a == 'PTL Status':
            for e, f in b.items():
                status = [v for k, v in f.items() if k =='action'] 
                status = ''.join(status)
                name = f"{k}: {a}: {status}"
                actions= []
                actions.append(f.get('action'))
                actions = set(actions)
                count = 0 
                for i in actions:
                    count +=1
                print(f"{name}: counts: {count}")

输出

(xenial)vash@localhost:~/python$ python3.7 dict.py
C_Charges: Id: added: counts: 1
C_Charges: P_Code: added: counts: 1
C_Insurance: Id: added: counts: 1
C_Insurance: Ins. Mode: added: counts: 1
C_Status: P_Status: Changed: counts: 1
C_Status: PTL Status: Changed: counts: 1
C_Status: PTL Scan Date: Changed: counts: 1

我敢肯定有更好的方法可以做到这一点,但是我将分解我的方法并向您展示我是如何实现的。为此,我将使用dict.get()函数,您可以在此处https://www.codzify.com/Python/python_dictionary.php

进行了解。

第一步

首先,我们来看看如何达到目标,每个action 为此,我们需要找出包含dict的嵌套action中的哪些元素,以便我们正确访问

让我们开始吧

for k, v in some_dictionary.items():
    print(f"""
        {k}
        ---
        {v}

     """)

这将返回:

(xenial)vash@localhost:~/python$ python3.7 dict.py

    C_Charges
    ---
    {'Id': {'action': 'added', 'new': '##########', 'old': 'Null'}, 'P_Code': {'action': 'added', 'new': '#####', 'old': 'Null'}}



    C_Insurance
    ---
    {'Id': {'action': 'added', 'new': '#######', 'old': 'Null'}, 'Ins. Mode': {'action': 'added', 'new': 'Primary', 'old': 'Null'}}



    C_Status
    ---
    {'P_Status': {'action': 'Changed', 'new': 'New', 'old': 'Blank'}, 'P_Code': {'None': 'None'}, 'PTL Status': {'PTL File No': {'action': 'Changed', 'new': '1', 'old': '01'}}, 'PTL Scan Date': {'action': 'Changed', 'new': '07/17/2018', 'old': '07/07/2018'}}

从这里我可以看到action代表key位于另一个嵌套在v的嵌套字典中

因此,现在我们可以将v视为字典。让我们看一下使用另一个for循环为key打印valuev.items()的情况:

for k, v in some_dictionary.items():
    for a, b in v.items():
        print(f"""
            {a}
            ----
            {b}
            ---
        """)

打印输出:

(xenial)vash@localhost:~/python$ python3.7 dict.py

        Id
        ----
        {'action': 'added', 'new': '##########', 'old': 'Null'} 


        P_Code
        ----
        {'action': 'added', 'new': '#####', 'old': 'Null'}


        Id
        ----
        {'action': 'added', 'new': '#######', 'old': 'Null'}


        Ins. Mode
        ----
        {'action': 'added', 'new': 'Primary', 'old': 'Null'}


        P_Status
        ----
        {'action': 'Changed', 'new': 'New', 'old': 'Blank'}   


        P_Code
        ----
        {'None': 'None'}    


        PTL Status
        ----
        {'PTL File No': {'action': 'Changed', 'new': '1', 'old': '01'}} 



        PTL Scan Date
        ----
        {'action': 'Changed', 'new': '07/17/2018', 'old': '07/07/2018'}

好的,现在好了,我可以看到action代表key中的b,这是一本字典,因此我可以使用b.get('action')并取回正确的值。

除了PTL Status,在这里我看到key仍然更深。如果我们看一下,它实际上是在字典中的value,在字典中是value的{​​{1}},所以我需要看一下PTL Status' s PTL Status作为字典。

让我们尝试一下:

value

现在我们得到:

for k, v in some_dictionary.items():
    for a, b in v.items():
        # later this will be b.get('action'), but hang on
        if a == 'PTL Status':
            for e, f in b.items():
                print(f)

这告诉我(xenial)vash@localhost:~/python$ python3.7 dict.py {'action': 'Changed', 'new': '1', 'old': '01'} action在字典key中,我可以理解。 因此,我为每个f申请了key并获得了我想要的所有dict.get('key')的途径

在实践中,这些途径看起来像这样:

values

此处唯一的代码是for k, v in some_dictionary.items(): for a, b in v.items(): if k == 'C_Status' and a == 'P_Code': continue elif a != 'PTL Status': b.get('action') elif a == 'PTL Status': for e, f in b.items(): f.get('action') ,这是仅对if k == 'C_Status' and a == 'P_Code': continue忽略P_Code,因为它将返回C_Status

第2步

我们现在的目标是为每个类别计算所有这些唯一的None。 在我的脑海中,这意味着我们必须为每个循环的所有值创建一个列表actionactions,并使其成为append,因此我们没有重复项。从那里我们必须计算set中的每个item。让我们看看如何做到这一点:

set

请注意,使用for k, v in some_dictionary.items(): for a, b in v.items(): if k == 'C_Status' and a == 'P_Code': continue elif a != 'PTL Status': actions = [] actions.append(b.get('action')) actions = set(actions) count = 0 for i in actions: count += 1 elif a == 'PTL Status': for e, f in b.items(): actions = [] actions.append(f.get('action')) actions = set(actions) count = 0 for i in actions: count += 1 b.get也会在每个循环开始时重置f.getactions = [],因为我们不需要它们来运行我们希望每个类别中的count = 0分别有count个。

第3步

最后,我们根据要求以正确的格式打印所有内容:

count

使用该模板,我试图了解{'C_charges:ID:added':counts, 'C_charges:P_Code:added':counts, 'C_Insurance:id:added':counts, 'C_Insurance:Ins. Mode:added':counts, 'C_Status:P_status:changed':counts} 这种格式所需要的一切。

对于print,我可以只使用它在C_*Categories循环中表示的变量,在每种情况下,该变量将在for中的k中使用。

对于子类别some_dictionary.items(),我可以使用ID, P_Code, ...中的变量a

现在得到for a, b in v.items()added这个词,我将其称为changed(回想起来应该更像status,以避免与state),我们将使用字典理解功能(在提供的链接中进行了解释),即看起来像这样:

P_Status

status = [v for k, v in b.items() if k =='action']

PTL Status

当我们打印status = [v for k, v in f.items() if k == 'action'] 时,它看起来像status,但我只想要['added'],所以又多了一行:

added

我将使用变量来构建一条语句,该语句可以打印并将其存储为status = ''.join(status) ,如下所示:

name

最后,我们可以将其与`name = f"{k}: {a}: {status}" count这样的语句结合起来:

print

将它们放在一起:

`print(f"{name}: counts: {count}")`

好吧,我希望这能帮助我不得不自学成才,并确保可以做得更好,但这就是我的能力,希望对我有帮助!

我还要再次看一下提供的字典,有些东西看起来很奇怪,例如for k, v in some_dictionary.items(): for a, b in v.items(): if k == 'C_Status' and a == 'P_Code': continue elif a != 'PTL Status': status = [v for k, v in b.items() if k == 'action'] status = ''.join(status) name = f"{k}: {a}: {status}" actions = [] actions.append(b.get('action')) actions = set(actions) count = 0 for i in actions: count += 1 print(f"{name}: counts: {count}") elif a == 'PTL Status': for e, f in b.items(): status = [v for k, v in f.items() if k =='action'] status = ''.join(status) name = f"{k}: {a}: {status}" actions= [] actions.append(f.get('action')) actions = set(actions) count = 0 for i in actions: count +=1 print(f"{name}: counts: {count}") 有一个动作,但嵌套在PTL File No中,它没有任何动作,但看起来像{ {1}}的深度应与PTL Status相同。如果您需要任何帮助,请发表评论。