Создать список со значениями словаря, содержащимися в другом списке - PullRequest
0 голосов
/ 04 мая 2020

У меня есть словарь, который связывает людей с их навыками:

d = {
    'A': {'name': 'Peter', 'skill': 'python'},
    'B': {'name': 'Mary', 'skill': 'c#'},
    'C': {'name': 'James', 'skill': 'java'}
 }

У меня есть список, в котором указаны необходимые навыки для различных заданий:

e = [
    ['python', 'java'],
    ['c#', 'R']
]

Мне нужно создать новый список с именами людей, которые имеют запрошенный навык (или 'N / A', если ничего не найдено) В этом случае результат будет:

rslt= [['Peter', 'James'], ['Mary', 'N/A']]

Следующие for-l oop (s) генерируют результат.

# with for loops
for r in range(len(e)):
    for s in range(0,len(e[r])):
        skill_found = 'false'
        for k in d.keys():
            if e[r][s] == d[k]['skill']:
                rslt[r][s] = d[k]['name']
                skill_found = 'true'
                break
        if skill_found == 'false':
                rslt[r][s] = 'N/A'
print(rslt)

Однако я бы очень хотел получить некоторое понимание списка / словаря, чтобы сделать то же самое, в котором я постоянно терпел неудачу. Следующие два оператора создают мусор:

#with list/dict comprehension
lstComp1 = [[d[k]['name'] if str(e[y][x]) == d[k]['skill'] else 'N/A' for x in range(0, len(e[y])) for k in d.keys()] for y in range(len(e))]
lstComp2 = [[x if x in d else 'N/A' for x in range(len(e[y]))] for y in range(len(e))]
print( lstComp1)
print(lstComp2)

Любая помощь будет наиболее ценной.

Ответы [ 2 ]

2 голосов
/ 04 мая 2020

@ андрей ответ хороший. Я написал это для любого python3.x

_any просто имитация any, но здесь он возвращает словарь, чтобы сделать вещи проще.

def _any(d,val):
    for v in d.values():
        if v['skill']==val:
            return v
    return {'name':'N/A'}
[[_any(d,v)['name'] for v in lst] for lst in e]
# [['Peter', 'James'], ['Mary', 'N/A']]
2 голосов
/ 04 мая 2020

Если вы используете Python 3.8, вы можете преобразовать for-loop в однострочник:

d = {
    'A': {'name': 'Peter', 'skill': 'python'},
    'B': {'name': 'Mary', 'skill': 'c#'},
    'C': {'name': 'James', 'skill': 'java'}
}

e = [
    ['python', 'java'],
    ['c#', 'R']
]

rslt = [[person['name'] if any((person:=v)['skill']==skill for v in d.values()) else 'N/A' for skill in task] for task in e]

print(rslt)

Отпечатки:

[['Peter', 'James'], ['Mary', 'N/A']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...