Home > Back-end >  How to loop through a list of dict and print values without duplicate?
How to loop through a list of dict and print values without duplicate?

Time:09-20

I'm trying to loop over this data:

data = [{
      "1331":{
         "2022-08-07 to 2022-08-13":10,
         "2022-08-14 to 2022-08-20":8
      },
      "1361":{
         "2022-08-14 to 2022-08-20":4,
         "2022-08-21 to 2022-08-27":4,
         "2022-08-28 to 2022-09-03":5,
         "2022-09-04 to 2022-09-10":4
      },
      "2479":{
         "2022-08-07 to 2022-08-13":18,
         "2022-08-14 to 2022-08-20":28,
         "2022-08-21 to 2022-08-27":34,
         "2022-08-28 to 2022-09-03":27,
         "2022-09-04 to 2022-09-10":20
      },
      "OOO":{
         "2022-08-28 to 2022-09-03":8
      }
   }]
# "AD" being the project name
# "2022-09-04 to 2022-09-10" is the weekly range
# 8 is the hours used for the project

and this should be the output:

1331
10
8
0
0
0
1361
0
4
4
5
4
2479
18
28
34
27
20
OOO
0
0
0
8
0

I'd like to print the values of each project's hours. If the weekly range isnt found, then print 0.

Here's my code and output so far:

date = ['2022-08-07 to 2022-08-13', '2022-08-14 to 2022-08-20', '2022-08-21 to 2022-08-27', '2022-08-28 to 2022-09-03', '2022-09-04 to 2022-09-10']

for record in data:
  for project_key, project_value in record.items():
    print(project_key)
    if len(date) == len(project_value.keys()):
      for value in project_value.values():
        print(value)
    else:
      for d in date:
        if d not in project_value.keys():
          print(0)
        else:
          for value in project_value.values():
            print(value)

Output = 
1331
0 # should be 10
0 # should be 8
0
10 # should be 0
8 # should be 0
1361
0
4
4
5
4
2479
18
28
34
27
20
OOO
0
0
0
0 # should be 8
8 # should be 0

When I loop through the list, looks like 0 is being printed out first then the hours. However, I want to print it in order, so if a weekly range isn't found, print 0 but if it is found, print the hours. How could I implement that? Thank you!

CodePudding user response:

for record in data:
    for project_key, project_value in record.items():
        print(project_key)
        for d in date:
            if d in project_value.keys():
                print(project_value[d])
            else:
                print(0)
1331
10
8
0
0
0
1361
0
4
4
5
4
2479
18
28
34
27
20
OOO
0
0
0
8
0

CodePudding user response:

I saw that the dictionary was inside a set, so i removed the unnecessary list bracket and then i also changed code, hope this helps

data = {
  "1331":{
     "2022-08-07 to 2022-08-13":10,
     "2022-08-14 to 2022-08-20":8
  },
  "1361":{
     "2022-08-14 to 2022-08-20":4,
     "2022-08-21 to 2022-08-27":4,
     "2022-08-28 to 2022-09-03":5,
     "2022-09-04 to 2022-09-10":4
  },
  "2479":{
     "2022-08-07 to 2022-08-13":18,
     "2022-08-14 to 2022-08-20":28,
     "2022-08-21 to 2022-08-27":34,
     "2022-08-28 to 2022-09-03":27,
     "2022-09-04 to 2022-09-10":20
  },
  "000":{
     "2022-08-28 to 2022-09-03":8
  }}
date = ['2022-08-07 to 2022-08-13', '2022-08-14 to 2022-08-20', '2022-08-21 to 2022-08-27', '2022-08-28 to 2022-09-03', '2022-09-04 to 2022-09-10']
for record in data:
    print(record)
    for test in date:
         try:
            print(data[record][test])
         except:
            print(0)

CodePudding user response:

Just to add to the accepted answer, this might be used to get all the dates in your data structure:

date = set()
for d in data[0].values():
    for k in d.keys():
        date.add(k)
date = sorted(list(date))
  • Related