Перебрать словарь python и вернуть соответствующее значение из списка - PullRequest
1 голос
/ 09 июля 2020

Мне сложно запустить этот код, и я надеюсь получить помощь от всех. У меня есть словарь и список, который мне нужно перебрать и вернуть словарь с соответствующим значением. Вот код, который у меня есть до сих пор, и желаемый результат, который я могу распечатать, чтобы превзойти

allJobs = {'A':[1,2,3],
           'B':[2,3,4],
           'C':[1,3],
           'D':[3,4]}

Jobs = ['A','C']

JobsWithNums = {}
matchJobs =[]


for jobs in allJobs:
    if jobs in Jobs:
        JobsWithNums.append(jobs)
        
print(JobsWithNums)
JobsWithNums = {'A':[1,2,3],
                'C':[1,3]}

Ответы [ 6 ]

3 голосов
/ 09 июля 2020

Причина ошибки -

Словарь в python не имеет метода append(), и, следовательно, вы получите примерно такую ​​ошибку -

<module>AttributeError: 'dict' object has no attribute 'append'>

Итак, метод append не работает со словарем для добавления новых пар ключ: значение. Поэтому вам нужно использовать его так, как я показал в приведенном ниже коде.

Правильное решение -

Вам нужно перебрать ключи словаря и добавить значение ключа, когда вы найдете соответствующий ключ. Вы должны сделать это следующим образом -

allJobs = {'A':[1,2,3],
           'B':[2,3,4],
           'C':[1,3],
           'D':[3,4]}

Jobs = ['A','C']

JobsWithNums = {}
matchJobs =[]


for jobs in allJobs.keys():
    if jobs in Jobs:
        JobsWithNums[jobs] = allJobs[jobs]
      # ^ : Adding the value corresponding to jobs when jobs is present in Jobs list
      # You were trying to do with append which is not the valid way to add a key to dictionary
print(JobsWithNums)

Вывод:

{'A': [1, 2, 3], 'C': [1, 3]}

Обратите внимание, что метод добавления не работает со словарем. Так что вы должны использовать это так, как я сделал это в коде. Вы также можете сделать это, используя метод dict.update(). Обратитесь к следующему фрагменту -

for jobs in allJobs.keys():
    if jobs in Jobs:
        JobsWithNums.update({jobs:allJobs[jobs]})
       # Another possible variant =>
       # JobsWithNums.update(jobs=allJobs[jobs])

Но это, вероятно, будет неэффективным способом сделать это по сравнению с первым. Используйте его, только если вам нужно обновить несколько ключей в словаре одновременно.

Альтернативный способ сделать это -

Более короткий (pythoni c) способ сделать это будет следующим образом =>

allJobs = {'A':[1,2,3],'B':[2,3,4],'C':[1,3],'D':[3,4]}    
Jobs = ['A','C']
               # The below code just says, add job_name:value pair if job_name exists in Jobs list
JobsWithNums = {job_name: value for job_name, value in allJobs.items()
                if job_name in Jobs}

print(JobsWithNums)

Вывод:

{'A': [1, 2, 3], 'C': [1, 3]}

Вы можете узнать больше об этом здесь - python docs

Надеюсь, это поможет!

1 голос
/ 09 июля 2020

Вы можете попробовать следующее:

for job in allJobs.keys():
    if job in Jobs:
        JobsWithNums[job] = alljobs[job]

.key () здесь возвращает имена заданий (A, B, C, D), и вы позже ссылаетесь на него как alljobs на получить значение.

0 голосов
/ 09 июля 2020

Спасибо за вашу помощь, и мне удалось запустить его. Также я пытаюсь экспортировать результат в excel, используя pandas фрейм данных, но не могу этого сделать и столкнулся с ошибкой массивов, которые должны иметь одинаковую длину - и как я могу назвать столбцы фрейма данных как Jobs, Числа

df = pd.DataFrame(JobsWithNums)
df.to_excel("file.xlsx")
0 голосов
/ 09 июля 2020

Лучший способ сделать это - пройтись по списку и, если этот элемент существует в словаре, добавить его в JobsWithNums. Преимущество этого заключается в том, что вам нужно выполнить итерацию по списку только один раз, а время поиска для словаря равно O (1), поэтому он будет более эффективным.

JobsWithNums = {}
for job in Jobs:
    if allJobs.get(job):
        JobsWithNums[job] = allJobs[job]

get () при возврате словаря None if ключ отсутствует

0 голосов
/ 09 июля 2020

Вы можете сделать это довольно легко с пониманием словаря:

jobsWithNums = {job_name: value for job_name, value in allJobs.items()
                if job_name in Jobs}
print(jobsWithNums)

И результат будет:

{'A': [1, 2, 3], 'C': [1, 3]}
0 голосов
/ 09 июля 2020

Метод добавления со словарями работает не так, как вы ожидаете. Чтобы обойти это, вы можете сделать следующее в вашем l oop:

for jobs, nums in allJobs.items():
    if jobs in Jobs:
        JobsWithNums[jobs] = nums

Это итерация по всем ключам и значениям в вашем словаре и создание этих записей в новом слове JobsWithNums.

В качестве альтернативы, вы можете построить тот же список в одной строке, используя понимание dict:

JobsWithNums = {k:v for k,v in allJobs if k in Jobs}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...