是否字典包含包含多个部分字符串的键



我试图测试一个字典,看看它是否包含包含部分字符串的键。具体来说,我正在构建一个机翼生成器,它将每个羽毛的控制分配给字典。点击一个按钮来镜像机翼,我需要测试机翼是否已经被镜像(然后如果它随后被撤消/删除,但这不是这个问题的一部分,很容易测试)。我希望通过检查羽毛字典来做到这一点,看看它是否有包含"L_"one_answers"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"

或者,创建另一个全局变量并将镜像true/false值存储到该变量中以进行测试是否会更简单?我试图保持我的全局变量到最低限度,但不确定他们如何影响资源。如有任何建议,不胜感激。

这种方法不那么冗长,有机会在找到匹配的键时尽早中断搜索,但在最坏的情况下仍然对键进行两次完整的遍历。

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

您使用的我想取决于您是否需要进行优化,如果您的字典中有许多键,并且在最坏的情况下只进行一次传递将是有帮助的。

首先构建字典时,使用两个不同的字典。将值放入正确的字典中(根据您的描述,可能两者都是)。其实,都有字典。

如果你想使用更实用的样式,你可以构建一个函数,根据你的类对羽毛进行分类:

def classify(s):
    return set(['L']) if 'L_' in s else set(['R'])

然后对键应用reduce:

wing = {'L_feather': 6 , 'R_feather' : 5}
reduce(lambda x, y: classify(x) | classify(y), wing)

结果在一个集合中包含两个white,您可以使用。is子集()的len()或其他方法轻松检查:

Out[30]:
set(['R', 'L'])

最新更新