字典是否包含包含多个部分字符串的密钥?
我想测试一个字典,看看它是否包含包含部分字符串的键。具体来说,我正在构建一个翼发生器,将每个羽毛的控制权分配给字典。点击一个按钮来镜像机翼,我需要测试机翼是否已经被镜像(然后如果它已经被撤消/删除,但这不是这个问题的一部分,并且很容易测试)。我希望通过检查羽毛字典来查看它是否包含同时包含“L_”和“R_”的Keys。字典是否包含包含多个部分字符串的密钥?
下面的代码做我想要的,但是相当详细。这里一定是一个更简单,更优雅的方式来做到这一点:
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"
或者,将它只是简单的创建另一个全局变量和存储镜像真/假值成用于测试?我试图尽量减少我的全局变量,但我们不确定它们如何影响资源。任何意见,将不胜感激。
这种方式不太详细,有机会在找到匹配关键字时提前中断搜索,但在最坏的情况下仍然会在关键字上进行两次完整传递。
if any('L_' in key for key in dict) and any('R_' in key for key in dict):
print 'has both'
注:这是在你的问题有点含糊,如果你正在寻找L_
和R_
出现在相同键或不(例如:"...L_...R_..."
)。如果是这样的话,使用方法:
if any('L_' in key and 'R_' in key for key in dict):
print 'has both'
这种方式是更冗长,但只要有可能爆发,而只会让一个人在最坏的情况下,即使通过。
RS=False
LS=False
for each in dict:
if "L_" in each:
LS=True
if "R_" in dict:
RS=True
if LS and RS:
print 'has both'
break
您使用我想取决于是否需要进行优化,如果你在你的字典里有很多按键,只有使在最坏的情况下,一个通将是有益的。
谢谢。看起来我并没有远离第二种选择,但是不太详细的方法也很好理解。非常感激。 – Kratch
当你在第一个地方建立字典时,有两个不同的字典。将这些值放入正确的字典中(根据您的描述,这可能是两种情况)。其实,有一本两本字典。
然后这个搜索问题不会发生。
如果你想用一个更实用的风格,你可以建立根据你的等级进行分类的羽毛功能:
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)
结果在一个包含两个惠特你可以很容易地检查与len().issubset()或其他:
Out[30]:
set(['R', 'L'])
这应该只横过你的列表一次。
你确定代码做你想要的吗?我认为你的意思是,如果在每个中都有R_,你就重复LS = True而不是RS = True。另外,你的意思是在循环内有'如果LS和RS:'?如果是这样,你不需要重复LS和RS为False每次迭代?如果您使代码正常工作,这里的人员可以更轻松地向您展示使代码更好的方法。 –