我有一个json风格的条目列表:
data =
[
{'data_1': 1, 'data_2': 1, 'key': A},
{'data_1': 0, 'data_2': 1, 'key': B},
{'data_1': 1, 'data_2': 0, 'key': A}
....
]
我想要做的是通过Key提取不同的示例,然后如果data_1为0则添加值“Good”,如果data_1在列表中的任何位置有1,则添加值“Bad”。
我现在的解决方案:
distinct = []
和used_data = []
{'key': item.key, 'value': "Good" (if item.data_1 is 0) or "Bad" (if item.data_1 is 1)}
附加到distinct item.key
已经在used_data
中,则迭代通过distinct,直到找到现有的密钥条目并更改为Bad,具体取决于您是否发现data_1在某个时刻等于1。如果价值不好,它永远不会变好。但是,如果值为Good,则如果data_1的密钥为1,则可能会变为“错误”。伪代码:
distinct = []
used_data = []
for each in data:
if each['key'] not in used_data:
used_data.append(each['key'])
if each['data_1'] = 1:
distinct.append({'key':each.key, 'data_1': each.data_1, 'value':'Bad'})
else:
distinct.append({'key':each.key, 'data_1': each.data_1, 'value':'Good'})
else:
for every in distinct:
if every['key'] = each['key']:
#change every.value to Bad if each.data_1 is 1
以上的作品,但对我来说感觉非常低效,我想知道是否有更好的方法。是否有一个特定于json的函数可以为我做一些这个?
答案 0 :(得分:0)
我只需在现有列表中迭代一次以获取“坏”键,然后再次迭代。我确信这种方式更加出色,但我认为它不会更快或更具可读性。
data = [
{'data_1': 1, 'data_2': 1, 'key': 'A'},
{'data_1': 0, 'data_2': 1, 'key': 'B'},
{'data_1': 1, 'data_2': 0, 'key': 'A'}
]
bad_data = set([item['key'] for item in data if item['data_1'] == 1])
new_data = []
for item in data:
item['value'] = 'Bad' if item['key'] in bad_data else 'Good'
new_data.append(item)
如果您不想要新列表(我不确定问题),那么您可以修改现有的词典列表:
bad_data = set([item['key'] for item in data if item['data_1'] == 1])
for item in data:
item['value'] = 'Bad' if item['key'] in bad_data else 'Good'