我正在尝试测试字典,看它是否包含包含部分字符串的键。具体来说,我正在构建一个机翼生成器,它将每个羽毛的控制分配给字典。在按钮上单击以镜像机翼,我需要测试机翼是否已经镜像(然后如果它已经被撤消/删除,但这不是这个问题的一部分并且很容易测试)。我希望通过检查羽毛字典来查看它是否包含同时包含“L_”和“R_”的键。
以下代码可以满足我的需求,但相当冗长。必须有一种更简单,更优雅的方法:
dict={}
RS=False
LS=False
for each in dict:
if "L_" in each:
LS=True
if "R_" in dict:
LS=True
if LS and RS:
print "has both"
或者,创建另一个全局变量并将镜像的真/假值存储到其中以进行测试会更简单吗?我试图将我的全局变量保持在最低限度,但我不确定它们如何影响资源。任何建议将不胜感激。
答案 0 :(得分:1)
这种方式不那么冗长,有机会在找到匹配键时提前中断搜索,但在最坏的情况下仍会对键进行两次完整传递。
if any('L_' in key for key in dict) and any('R_' in key for key in dict):
print 'has both'
注意:如果您希望L_
和R_
出现在相同的键中,那么您的问题会有点含糊不清(例如:{{1 }})。如果是这种情况,请使用:
"...L_...R_..."
这种方式更加冗长,但是尽快爆发,即使在最坏的情况下也只能通过一次。
if any('L_' in key and 'R_' in key for key in dict):
print 'has both'
我认为你使用哪个取决于你是否需要在你的词典中有很多键进行优化,而在最坏的情况下只进行一次传递会有所帮助。
答案 1 :(得分:0)
首先构建字典时,有两个不同的字典。将值放在正确的字典中(根据您的描述可能是两者)。事实上,有一个字典。
然后不会发生此搜索问题。
答案 2 :(得分:0)
如果你想使用更实用的风格,你可以建立一个根据你的类别对羽毛进行分类的功能:
def classify(s):
return set(['L']) if 'L_' in s else set(['R'])
然后只需将缩减应用于您的键:
wing = {'L_feather': 6 , 'R_feather' : 5}
reduce(lambda x, y: classify(x) | classify(y), wing)
包含whit的集合中的结果可以使用.issubset()的len()或其他任何内容轻松检查:
Out[30]:
set(['R', 'L'])
这应该只会横列一次。