python: получить последний соответствующий словарь из списка - PullRequest
0 голосов
/ 05 июля 2018

Как получить последний соответствующий словарь из списка словарей:

Пример:

test_dict={'user'='xxx','tasks':[{'id':'01','age':'60'},{'id':'02','age':'50'},{'id':'01','age':'65'},{'id':'02','age':'65'}]}

Как мне получить последний дикт из задач, чей «id» - «01»?

Нужно ли перебирать весь список - test_dict ['tasks'] или есть какой-нибудь хороший подход?

Спасибо

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Вы можете использовать next с выражением генератора, которое повторяет список в обратном порядке. Если совпадений не найдено, функция вернет None.

def get_last(d, val):
    return next((i for i in reversed(d['tasks']) if i['id'] == val), None)

res = get_last(test_dict, '01')

print(res)

{'id': '01', 'age': '65'}
0 голосов
/ 05 июля 2018

@ Aavik , вы можете попробовать следующий код.

Я использовал функцию filter () для фильтрации словарей по определенным ключам.

Попробуйте ввести код онлайн на http://rextester.com/URYZW46252 (менее эффективный способ использования filter () function).

Также попробуйте http://rextester.com/HLVQL50077 (используя понимание списка , что является эффективным способом).

def get_last_dict_with_specific_id(test_dict, id):
    # Create tasks list from test_dict
    tasks = test_dict["tasks"]

    # filter tasks list based on dictionaries id i.e get a list of dictionaries with only specific id
    # Update the same list tasks with different content (save space)
    tasks = [d for d in tasks if d["id"] == id]
    # tasks = filter(lambda d: d["id"] == id, tasks) # This is efficient like above one

    # Pick the last dictionary and return it
    if tasks:
        return tasks[len(tasks) - 1]
    else:
        return {}

# TEST    

test_dict = {'user': 'xxx','tasks': [{'id':'01','age':'60'},{'id':'02','age':'50'},{'id':'01','age':'65'},{'id':'02','age':'65'}]};

last_dict_01 = get_last_dict_with_specific_id(test_dict, '01');
print last_dict_01;  # {'age': '65', 'id': '01'}

last_dict_02 = get_last_dict_with_specific_id(test_dict, '02');
print last_dict_02;  # {'age': '65', 'id': '02'}

last_dict_03 = get_last_dict_with_specific_id(test_dict, '03');
print last_dict_03;  # {} 
0 голосов
/ 05 июля 2018

Это должно соответствовать вашей цели.

test_dict={'user':'xxx','tasks':[{'id':'01','age':'60'},{'id':'02','age':'50'},{'id':'01','age':'65'},{'id':'02','age':'65'}]}

id_key = '01'

id_value = {}

tasks = test_dict['tasks']

for i in reversed(tasks):
    if(i['id'] == id_key):
        id_value = i
        break;


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