Why does this for loop loop twice?

This is what I’m trying to accomplish:

``````list_dic_gen(['One','Two'], [['First','Second']])
``````

is

``````[{'One': 'First', 'Two': 'Second'}]
``````

As a second example of this, the function call:

``````list_dic_gen(['Second'], [['One'],['Third Fourth']])
``````

would be expected to return:

``````[{'Second': 'One'}, {'Second': 'Third Fourth'}]
``````

But my code

``````def list_dic_gen(lst,lol):
acc=[]
a=0
for x in lol:
accd={}
for b in x:
accd[lst[a]]=b
acc.append(accd)
if len(lst)>1:
a+=1
return acc
``````

This code works for the second example, but for the first example, the for loop makes 2 dictionaries even though there is 1 list in the list

``````[{'One': 'First', 'Two': 'Second'}, {'One': 'First', 'Two': 'Second'}]
``````

>Solution :

Because there are 2 `b`‘s in `x` and you are appending for both. Append `acc` after the inner loop.

``````def list_dic_gen(lst,lol):
acc=[]
a=0
for x in lol:
accd={}
for b in x:
accd[lst[a]]=b
a += len(lst)>1 #you don't need a condition
acc.append(accd)  #append the list after the loop
return acc

print(list_dic_gen(['One','Two'], [['First','Second']]))
``````

I believe my complete refactor of your function does the same thing that yours does.

``````def list_dic_gen(keys, data) -> list[dict]:
return [{keys.pop():value for value in values} for values in data]
``````