简体   繁体   中英

How to check if value exists in python list of objects

if i have a simple list objects:

shapes = [
  {
    'shape': 'square',
    'width': 40,
    'height': 40
  },
  {
    'shape': 'rectangle',
    'width': 30,
    'height': 40

  }
]

How can i quickly check if a shape with value square exists? I know I can use a for loop to check each object, but is there a faster way?

Thanks in advance!

You can do this in one line with the builtin function any :

if any(obj['shape'] == 'square' for obj in shapes):
    print('There is a square')

This is equivalent to the for-loop approach, though.


If you need to get the index instead, then there is still a one-liner that can do this without sacrificing efficiency:

index = next((i for i, obj in enumerate(shapes) if obj['shape'] == 'square'), -1)

However, this is complicated enough that it's probably better to just stick with a normal for loop.

index = -1
for i, obj in enumerate(shapes):
    if obj['shape'] == 'square':
        index = i
        break

Look ma, no loop.

import json
import re

if re.search('"shape": "square"', json.dumps(shapes), re.M):
    ... # "square" does exist

If you want to retrieve the index associated with square , you'd need to iterate over it using for...else :

for i, d in enumerate(shapes):
    if d['shape'] == 'square':
        break
else:
    i = -1

print(i) 

Performance

100000 loops, best of 3: 10.5 µs per loop   # regex
1000000 loops, best of 3: 341 ns per loop   # loop

You can try this, using get for a more robust solution:

if any(i.get("shape", "none") == "square" for i in shapes):
    #do something
    pass

Using list comprehension you can do:

if [item for item in shapes if item['shape'] == 'square']:
    # do something

Using filter() :

if list(filter(lambda item: item['shape'] == 'square', shapes)):
    # do something

Checking only if it exists:

any(shape.get('shape') == 'square' for shape in shapes)

Getting first index (you will get StopIteration exception if it does not exist).

next(i for i, shape in enumerate(shapes) if shape.get('shape') == 'square')

All indexes:

[i for i, shape in enumerate(shapes) if shape.get('shape') == 'square']
import operator
shape = operator.itemgetter('shape')
shapez = map(shape, shapes)
print('square' in shapez)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM