如果我有一个简单的列表对象:
.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
循环来检查每个对象,但有更快的方法吗?
提前致谢!
答案 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)