我目前拥有的东西
我想从此数据集中创建一个列表,仅包含名称值,但将它们按每个“问题”分组,因此我可以遍历此列表并根据优先级返回一个值。
{
"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']
我不需要更改其他值,只需更改具有多个值的条目即可。
答案 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'])