0

I am having trouble getting key values in a JSON.

import json


packages = [
  [
    {
      "name": "a2ps",
      "installs": 61423
    },
    {
      "name": "aravis",
      "installs": 61424
    },
    {
      "name": "arangodb",
      "installs": 61425
    }
  ],
  [
    {
      "name": "argon2",
      "installs": 61420
    },
    {
      "name": "archivemount",
      "installs": 61421
    },
    {
      "name": "archivemail",
      "installs": 61422
    }
  ]
]

package_names = [package_name['name'] for package_name in packages]
package_installs = [package_installs['installs'] for package_installs in packages]

As you can see, I am trying to get the packages name and install numbers but when I run the code I get an error. This is the full traceback:

Traceback (most recent call last):
  File "/Users/me/Documents/json.py", line 1, in <module>
    import json
  File "/Users/me/Documents/json.py", line 35, in <module>
    package_names = [package_name['name'] for package_name in packages]
  File "/Users/me/Documents/json.py", line 35, in <listcomp>
    package_names = [package_name['name'] for package_name in packages]
TypeError: list indices must be integers or slices, not str

But when I do the following, I do the get the names and installs but for only for the specified package.


package_names = [package_name['name'] for package_name in packages[0]]
package_names2 = [package_name['name'] for package_name in packages[1]]
package_installs = [package_installs['installs'] for package_installs in packages[0]]
package_installs2 = [package_installs['installs'] for package_installs in packages[1]]
print(package_names, package_names2, package_installs, package_installs2)

Output:

['a2ps', 'aravis', 'arangodb'] ['argon2', 'archivemount', 'archivemail'] [61423, 61424, 61425] [61420, 61421, 61422]
1
  • What's the question? You know that packages is a list of lists of dictionaries (that have nothing to do with JSON, BTW - they're regular Python dictionaries). You want to iterate over the inner lists. But since packages is a list of lists, you need to iterate over these inner lists first. Commented Nov 23, 2019 at 19:42

5 Answers 5

1

You were close, since you have a list of dict lists, you need to use two loops in the list comprehensions:

packages = [[{'name': 'a2ps', 'installs': 61423}, {'name': 'aravis', 'installs': 61424}, {'name': 'arangodb', 'installs': 61425}], [{'name': 'argon2', 'installs': 61420}, {'name': 'archivemount', 'installs': 61421}, {'name': 'archivemail', 'installs': 61422}]]

package_names = [package_name['name'] for ls in packages for package_name in ls]
package_installs = [package_install['installs'] for ls in packages for package_install in ls]

print(package_names)
print(package_installs)

Output:

['a2ps', 'aravis', 'arangodb', 'argon2', 'archivemount', 'archivemail']
[61423, 61424, >61425, 61420, 61421, 61422]

As you can see, you also don't need to use the json package for anything, these are just regular plain Python lists and dicts.

Sign up to request clarification or add additional context in comments.

Comments

1

The top TWO levels of your json are list, so when you do:

[package_name['name'] for package_name in packages]

You forgot that each element in packages is another list, not the package_name dictionary.

Instead try a double list comprehension:

package_names = [package_name['name'] for sub_packages in packages for package_name in sub_packages]
package_installs = [package_install['installs'] for sub_packages in packages for package_install in sub_packages]

Comments

0

You need nested loops to process the nested lists.

package_names = []
package_installs = []
for sublist in packages:
    for package in sublist:
        package_names.append(package['name'])
        package_installs.append(package['installs'])

Comments

0

Like others mentioned, you need another layer:

package_names = [package_name['name'] for package in packages for package_name in package ]

Comments

0
   packages = [[{'name': 'a2ps', 'installs': 61423}, {'name': 'aravis', 'installs': 61424}, {'name': 'arangodb', 'installs': 61425}], [{'name': 'argon2', 'installs': 61420}, {'name': 'archivemount', 'installs': 61421}, {'name': 'archivemail', 'installs': 61422}]]

nameInstallDic= {package_name['name']: package_name['installs'] for ls in packages for package_name in ls}
name=nameInstallDic.keys()
installs=nameInstallDic.values()
name=list(name)
installs=list(installs)
print('name: ',name)
print('installs: ',installs)

outPut: name: ['aravis', 'argon2', 'archivemail', 'a2ps', 'archivemount', 'arangodb']
installs: [61424, 61420, 61422, 61423, 61421, 61425]

or you can use another below approach

iterObj = iter(packages)

package_names = [package_name['name'] for package_name in [*next(iterObj), *next(iterObj)]]

print('package_names :', package_names)

iterObj2 = iter(packages)
package_installs = [package_install['installs'] for package_install in [*next(iterObj2), *next(iterObj2)]]
print('package_installs:', package_installs)

Output : package_names : ['a2ps', 'aravis', 'arangodb', 'argon2', 'archivemount', 'archivemail'] package_installs: [61423, 61424, 61425, 61420, 61421, 61422]

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.