как получить обновленный список более естественным и не использовать флаг - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть два списка, которые

old_list = [{"tag": "apple","value":4}, {"tag": "orange","value":5}]
new_list = [{"tag": "apple","value":1}, {"tag": "orange","value":2}, {"tag": "grape","value":3}]

Я хочу new_list, который, если new_list's item['tag'] равен old_list's item['tag'], new_list['value'] равен old_list['value'], если new_list имеет новый элемент,
затем new_list['value'] инициализируйте 0.

, в результате чего:

new_list = [{"tag": "apple","value":4}, {"tag": "orange","value":5}, {"tag": "grape","value":0}]

вот мой инструмент:

old_list = [{"tag": "apple","value":4}, {"tag": "orange","value":5}]
new_list = [{"tag": "apple","value":1}, {"tag": "orange","value":2}, {"tag": "grape","value":3}]
update_list = []
for new in new_list:
    flag_new_item = True
    for old in old_list:
        if new["tag"] == old['tag']:
            new["value"] = old['value']
            flag_new_item = False
            break
    if flag_new_item:
        new['value'] = 0
print(new_list)

, так как я использую 2'timesитератор для реализации задачи, которая, я думаю, слишком медленная и не в стиле Python, плюс я ввел новый флаг, который выглядит не очень хорошо.есть ли более направленный, удобный, эффективный способ его реализации

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Вы можете создать словарь от tag до value из old_list и соответственно обновить элементы new_list:

old_list = [{"tag": "apple","value":4}, {"tag": "orange","value":5}]
new_list = [{"tag": "apple","value":1}, {"tag": "orange","value":2}, {"tag": "grape","value":3}]

# create a dictionary from old_list
old_tags = {i['tag']: i['value'] for i in old_list}

# update new_list with old_list values if present
for item in new_list:
    item['value'] = old_tags.get(item['tag'], 0)

print(new_list)

Вывод

[{'tag': 'apple', 'value': 4}, {'tag': 'orange', 'value': 5}, {'tag': 'grape', 'value': 0}]
0 голосов
/ 11 декабря 2018

Используйте списочное понимание, имеющее словарное понимание, и используйте также условия:

print([{k:(next(iter(old_list[idx:idx+1]),{}).get(k,0) if k=='value' else v) for k,v in i.items()} for idx,i in enumerate(new_list)])

Сначала используйте enumerate, затем выполните цикл, затем получите словарное понимание с условием для значения и получитеЗначение old_list, если возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...