2013-05-15 51 views
0

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

或者,将它只是简单的创建另一个全局变量和存储镜像真/假值成用于测试?我试图尽量减少我的全局变量,但我们不确定它们如何影响资源。任何意见,将不胜感激。

+0

你确定代码做你想要的吗?我认为你的意思是,如果在每个中都有R_,你就重复LS = True而不是RS = True。另外,你的意思是在循环内有'如果LS和RS:'?如果是这样,你不需要重复LS和RS为False每次迭代?如果您使代码正常工作,这里的人员可以更轻松地向您展示使代码更好的方法。 –

回答

1

这种方式不太详细,有机会在找到匹配关键字时提前中断搜索,但在最坏的情况下仍然会在关键字上进行两次完整传递。

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 

您使用我想取决于是否需要进行优化,如果你在你的字典里有很多按键,只有使在最坏的情况下,一个通将是有益的。

+0

谢谢。看起来我并没有远离第二种选择,但是不太详细的方法也很好理解。非常感激。 – Kratch

0

当你在第一个地方建立字典时,有两个不同的字典。将这些值放入正确的字典中(根据您的描述,这可能是两种情况)。其实,有一本两本字典。

然后这个搜索问题不会发生。

+0

我使用单独创建每个羽毛的单独方法创建羽毛(羽毛数量可变),然后将控件名称分配给字典。当我镜像时,我使用基于对边字典长度的羽毛数值运行相同的方法(然后运行新方的每个控件并从相反侧的羽毛控件复制属性)。因为创建双方的方法相同,所以它使用相同的字典。所以我不确定第二羽羽毛字典是否可行,或比“镜像测试”全局变量更好。 – Kratch

+0

@Kratch这听起来好像你不应该分开双方,如果是这样的话。我发现你的描述太模糊不清,以至于推荐更合适的数据结构,但我确信它们存在。 – Marcin

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) 

结果在一个包含两个惠特你可以很容易地检查与len().issubset()或其他:

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

这应该只横过你的列表一次。