python - 根据条件在数组中添加随机值
问题描述
我有输入
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。我在哪里做错了?
解决方案
这是因为当您初始化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']}
推荐阅读
- javascript - 如何获取所有元素的数据,而不仅仅是第一个元素
- cassandra - Cassandra 基于轻量级事务的序列生成器一致性失败?
- python - How to add data to nested serializers?
- algorithm - 谷歌 Foobar 游戏
- webpack - 获取 @babel/present-env 的默认实现以与 IE11 一起使用
- android - 具有 StaggeredGridLayoutManager 的 Recyclerview 元素正在反向加载
- php - 执行输入数据时显示的 PHP 代码
- apache-kafka - 文件更改时如何更新 Kafka 文件源连接器?
- azure - 自定义 Azure IR 的问题
- firebase - 在使用 firebase-functions-test 和 mocha 测试 Firebase Cloud Functions 时创建/检索更新的数据