【问题标题】:Add random values in array based on condition根据条件在数组中添加随机值
【发布时间】:2020-09-05 07:05:36
【问题描述】:

我有意见

record = {
    "Data": [{
            "Name": "ABC",
            "Result": "PASSED"
        },
        {
            "Name": "XYZ",
            "Result": "FAILED"
        }]}

现在我想转换成{'PASSED': ['ABC'], 'FAILED': ['XYZ'], 'Values':[]}

但是当我使用下面的代码时

name_keys = ['PASSED', 'FAILED']
transformed_result = {}.fromkeys(name_keys + ['Values'], [])
for each_result in record['Data']:
    result = each_result['Result'].upper()
    if result in name_keys:
        transformed_result[result].append(each_result['Name'])
        print(transformed_result)

我明白了

{'Values': ['ABC', 'XYZ'], 'PASSED': ['ABC', 'XYZ'], 'FAILED':  
['ABC', 'XYZ']}

我正在使用 python3。我哪里做错了?

【问题讨论】:

    标签: python python-3.x list foreach


    【解决方案1】:

    这是因为当你初始化 transformed_result 字典时,python 首先创建一个新列表(.from_keys 函数中的最后一个参数),然后将这个列表分配给字典的所有条目。您可以通过打印它的 id 来检查它是否始终是同一个列表:

    在我的电脑上:

    >>> id(transformed_result['PASSED'])                                                                                                                                                                    
    140079882748464 
    
    >>> id(transformed_result['FAILED'])                                                                                                                                                                    
    140079882748464 
    

    也可以:

    >>> transformed_result['FAILED'] is transformed_result['PASSED']
    True
    

    因此,要解决您的问题,您需要为每个条目提供不同的列表实例。只需将上面的行更改为:

    transformed_result = {key: [] for key in name_keys + ['Values']}
    

    【讨论】:

      【解决方案2】:

      可以在这里使用collections.defaultdictResultName 分组到列表中:

      from collections import defaultdict
      
      record = {
          "Data": [{"Name": "ABC", "Result": "PASSED"}, {"Name": "XYZ", "Result": "FAILED"}]
      }
      
      d = defaultdict(list)
      
      for r in record["Data"]:
          d[r["Result"]].append(r["Name"])
      
      # Add empty list
      d["Values"]
      
      print(d)
      # defaultdict(<class 'list'>, {'PASSED': ['ABC'], 'FAILED': ['XYZ'], 'Values': []}
      

      【讨论】:

        【解决方案3】:
        record = {
            "Data": [{
                    "Name": "ABC",
                    "Result": "PASSED"
                },
                {
                    "Name": "XYZ",
                    "Result": "FAILED"
                }]}
        
        
        out = {'Values': []}
        for d in record['Data']:
            out.setdefault(d['Result'], []).append(d['Name'])
        print(out)
        

        打印:

        {'Values': [], 'PASSED': ['ABC'], 'FAILED': ['XYZ']}
        

        【讨论】:

        • 执行时间是否太长? @Andrej Kesely
        • @Vivek 不应该,追加到列表很快 - 取决于你有多少项目。
        • 这个答案没有解释问题是什么,而是盲目地提出了不同的解决方案。 OP 没有学习如何解决他的问题。
        猜你喜欢
        • 2016-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-10
        • 2016-07-14
        • 2020-03-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多