遍历python字典并从列表中返回匹配值

时间:2020-07-09 17:35:54

标签: python dictionary

我很难使这段代码运行,希望能得到大家的帮助。我有一个字典和一个列表,我需要遍历该列表并返回具有匹配值的字典。这是我到目前为止拥有的代码,以及我也可以打印出对Excel的需求输出

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 个答案:

答案 0 :(得分:3)

错误原因-

Python中的词典没有append()方法,因此您将收到类似这样的错误-

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

因此,append方法不适用于添加新的key:value对的字典。因此,您必须按照下面代码中显示的方式使用它。


正确的解决方案-

找到匹配的键时,您必须遍历字典的键并附加键的值。您应该按照以下步骤进行操作-

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]}

请注意,append方法不适用于字典。因此,您必须像在代码中一样使用它。您也可以使用dict.update()方法。请参考以下代码段-

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

但是,与第一个方法相比,这可能是一种低效的方法。仅在必须一次将多个键更新到字典中时使用它。


替代方法-

更短的(pythonic)方式如下=>

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 :(得分:1)

您可以尝试以下方法:

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

此处的.key()返回作业的名称(A,B,C,D),稍后您可以像alljobs一样引用它以获得值。

答案 2 :(得分:0)

append方法不适用于字典。您可以在循环中执行以下操作来解决此问题:

#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
    int edad[100], n, i, emayor=0;
    float suma;
    
    do {
     cout << "Ingrese su edad: ";
     cin >> edad[i];
     suma+=edad[i];
     i++;
     cout << "\n\nDesea Ingresar Edades? (1/0) ";
     cin >> n;
    } while(n==1 && i<100);
    cout << "La sumatoria de edades es: "<< suma;
    
    if (edad[i]>emayor) {
      emayor=edad[i];
      cout << "\nLa edad mayor es: "<<emayor;
    }
    getch();
    return 0;
}

这将遍历字典中的所有键和值,并在新的JobsWithNums字典中创建这些条目。

或者,您也可以使用dict理解力在一行中建立相同的列表:

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

答案 3 :(得分:0)

通过字典理解,您可以轻松地做到这一点:

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]}

答案 4 :(得分:0)

一种更好的方法是遍历列表,如果字典中存在该元素,则将其追加到JobsWithNums。 这样做的一个优点是,您只需要遍历列表一次,字典的查找时间为O(1),因此效率更高。

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

如果不存在密钥,则字典上的get()返回None

答案 5 :(得分:0)

感谢您提供的所有帮助,我已经能够运行它。另外我正在尝试使用pandas数据框将结果导出到excel,但无法做到这一点,并遇到必须全部相同长度的数组错误-我如何将数据框的列命名为Jobs,Nums < / p>

df = pd.DataFrame(JobsWithNums)
df.to_excel("file.xlsx")