从数据创建列表以包含多个条目,然后遍历列表以返回一个字符串

时间:2019-01-02 21:48:57

标签: python python-3.x

我目前拥有的东西

我想从此数据集中创建一个列表,仅包含名称值,但将它们按每个“问题”分组,因此我可以遍历此列表并根据优先级返回一个值。

{
 "issues": [
    {
      "fields": {
        "components": [],
        "customfield_1": null,
        "customfield_2": null
      }
    },
    {
      "fields": {
        "components": [
            {
              "name": "Testing"
            }
          ],
        "customfield_1": null,
        "customfield_2": null
      }
    },
    {
      "key": "3",
      "fields": {
         "components": [
            {
              "name": "Documentation"
            },
            {
               "name": "Manufacturing"
            }
           ],
          "customfield_1": null,
          "customfield_2": null
      }
     }
  ]
 }

我希望输出看起来像这样:

['null', 'testing', ('Documentation', 'Manufacturing')]

我能够通过以下代码完成此任务: (对格式很抱歉,不确定在不将其放在一行的情况下如何使其看起来更好)

list((
'null' if len(item['fields']['components'])== 0 
else 
item['fields']['components'][0]['name']) if len(item['fields']['components'])==1 
else 
(item['fields']['components'][0]['name']), item['fields']['components'][1]['name']))) 
for item in data['issues'])

问题

现在我需要从上面的输出中获取值("Documentation", "Manufacturing")才能根据优先级仅返回1个组件。

我认为我需要遍历['Documentation', 'Testing', 'Manufacturing"]之类的东西 因此,点击后,说“文档”,它停止并仅返回“文档”。 (此列表特定于优先级,并按从高到低的顺序排列)

我希望最终列表为['null', 'Testing', 'Documentation']

我不需要更改其他值,只需更改具有多个值的条目即可。

2 个答案:

答案 0 :(得分:1)

下面的代码怎么样?我基本上是在索引优先级列表,并采用最小的列表(因为我们认为开始时优先级最高)。如果优先级列表发生更改,我们可以将其切换为max

尝试一下:

import json

with open("file.json") as f:
   data = json.load(f)

result = []
priority = ['Documentation', 'Testing', 'Manufacturing']

for issue_dict in data['issues']:
    if len(issue_dict["fields"]["components"]) == 0:
        result.append([('null', 0)])
    else: # Can support arbitrary number of custom fields
        result.append([(list(name_dict.values())[0], priority.index(list(name_dict.values())[0]))  for name_dict in issue_dict["fields"]["components"]])

print(result)
# [[('null', 0)], [('Testing', 1)], [('Documentation', 0), ('Manufacturing', 2)]]

result = [min(item, key= lambda x: x[1])[0] for item in result]

print(result)
#['null', 'Testing', 'Documentation']

对于嵌套列表:如果长度为1,那么min显然将只是唯一的选择。对于其他索引,我们发现索引最小即aka最高优先级。

我已经包含了一些打印语句,这些语句仅用于调试,以供您查看是否有意义。希望这会有所帮助。

答案 1 :(得分:0)

所以我最终以这种方式这样做:

创建一个函数,该函数将查看给定列表中是否有“组件”,并在找到给定组件时返回并停止迭代

def _define_component(multiple_component_list):

        for components in ['Documentation', 'Testing', 'Manufacturing']:
            if components in multiple_component_list:
                return components

        return 'Unknown'

并使用长度> 1作为参数时使用的表达式来理解列表中的函数(与原始代码相同,除了最后一个“ else”语句之后)

list(('Unknown' if len(item['fields']['components']) == 0 else
                           item['fields']['components'][0]['name'] if len(
                           item['fields']['components']) == 1 else _define_component(
                           [item['fields']['components'][0]['name'],
                            item['fields']['components'][1]['name']]))for item in data['issues'])