如何检查python对象列表中是否存在值

时间:2017-09-10 02:05:23

标签: python list object dictionary

如果我有一个简单的列表对象:

.menu {
  /* menu styles */
}

#main-page #main, #shop-page #shop, #about-page #about {
  /* styles for highlight the current page */
}

如何快速检查shapes = [ { 'shape': 'square', 'width': 40, 'height': 40 }, { 'shape': 'rectangle', 'width': 30, 'height': 40 } ] 是否存在值shape?我知道我可以使用square循环来检查每个对象,但有更快的方法吗?

提前致谢!

6 个答案:

答案 0 :(得分:6)

您可以使用内置函数any在一行中执行此操作:

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

这相当于for循环方法。

如果您需要获取索引,那么仍然可以在不牺牲效率的情况下执行此操作:

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

但是,这很复杂,只需坚持正常的for循环就可能更好。

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

答案 1 :(得分:4)

看,马,没有循环。

import json
import re

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

如果您要检索与square相关联的索引,则需要使用for...else进行迭代:

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

print(i) 

<强>性能

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

答案 2 :(得分:1)

您可以尝试使用get来获得更强大的解决方案:

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

答案 3 :(得分:1)

使用list comprehension即可:

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

使用filter()

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

答案 4 :(得分:1)

仅检查是否存在:

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

获取第一个索引(如果不存在,您将获得StopIteration异常)。

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

所有索引:

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

答案 5 :(得分:1)

import operator
shape = operator.itemgetter('shape')
shapez = map(shape, shapes)
print('square' in shapez)