2016-11-08 4 views
2

Учитывая меняPython Получить словарное значение с ключом список

users = \ 
{ 
    'Sam': { 
     'age': 19, 
     'location': 'Flodira', 
     'country': 'United States' 
    }, 
    'Max': { 
     'age': 16, 
     'location': 'Sydney', 
     'country': 'Australia' 
    } 
} 

def getUserValue(query): 
    return users[query] 

getUserValue(['Sam', 'location']) 

Как я мог это сделать? Я знаю, что могу прямо сделать users['Sam']['location'], что я хотел бы сделать, это получить местоположение Сэма через объект списка.

+0

Создайте функцию, которая принимает список в качестве аргумента и просто делает пользователям '[«Sam»] [«место»] ', используя значения из списка .. –

+0

Вы хотите, чтобы сохраненные данные или ключи были списком? Может ли этот «список объектов» быть двумя списками или списком, содержащим два списка или что-то еще? Какую производительность вы хотите, и прикажите n быть достаточно хорошим? Наконец, что не так с 'users ['Sam'] ['location']'? –

+0

@ Farhan.K Я знаю, что функция может быть 'def getUserValue (пользователь, значение)', но это не так, я хотел бы получить значение X с помощью List. –

ответ

1

Вот общее решение, которое обрабатывает различные уровни вложенности:

def getUserValue(users, query): 
    v = users 
    for i in query: 
     v = v[i] 
    return v 

print(getUserValue(users, ['Sam', 'location'])) 
# Flodira 
+0

Спасибо! Это сработало! –

0
def getUserValue(query): 
    assert(len(query) == 2) 
    return users[query[0]][query[1]] 

Это вы что искали?

+0

Не совсем, но спасибо в любом случае! –

0

Вы могли бы решить эту проблему с помощью рекурсии:

def getByList(d, l): 
    if len(l) == 0: 
     return d 
    else: 
     return getByList(d[l[0]], l[1:]) 

def getUserValue(query): 
    return getByList(users, query) 
+1

вы также можете просто проверить 'if l' и flip flop ваши возвращения .. пустой список falsey – Aaron

+1

Правда, но я думаю, что это более явное. Неясно, проверяю ли я 'l' непустой список или' '' '' '' '' '' '' '' '' или что-то еще ложное. –

0

Для более общего решения, чем Джаред, вы можете использовать список распаковка с рекурсивной функцией.

def getUserValue(dic, lis): 
    if len(lis) > 1: 
     return getUserValue(dic[lis[0]], lis[1:]) 
    else: 
     return dic[lis[0]] 
+0

Не думал об этом, спасибо! –

0

Как насчет следующего?

users = \ 
{ 
    'Sam': { 
     'age': 19, 
     'location': 'Flodira', 
     'country': 'United States' 
    }, 
    'Max': { 
     'age': 16, 
     'location': 'Sydney', 
     'country': 'Australia' 
    } 
} 

def getUserValue(my_args): 
    item = users[my_args.pop(0)] 
    while my_args: 
     item = item[my_args.pop(0)] 
    return item 

print(getUserValue(['Sam', 'location'])) # prints -> Flodira 

продолжает лечение item в качестве словаря, пока передаваемый список не будет исчерпан.

+0

Да точно! Спасибо! –

0

Вы можете использовать обычный старый reduce и operator.getitem

import operator 

def getUserValue(dic, lis): 
    return reduce(operator.getitem, lis, dic) 
Смежные вопросы