0

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

或者,创建另一个全局变量并将镜像的真/假值存储到其中进行测试会更简单吗?我试图将我的全局变量保持在最低限度,但不确定它们如何影响资源。任何意见,将不胜感激。

4

3 回答 3

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

我想你使用哪个取决于如果你的字典中有很多键,你是否需要进行优化,并且在最坏的情况下只通过一次会很有帮助。

于 2013-05-15T14:52:56.163 回答
0

当您首先构建字典时,有两个不同的字典。将值放在正确的字典中(根据您的描述,可能两者都有)。事实上,有一本既定的字典。

那么这个搜索问题就不会出现了。

于 2013-05-15T14:32:57.433 回答
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)

结果包含两个白色的集合,您可以使用 .issubset() 的 len() 或其他任何内容轻松检查:

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

这应该只横穿您的列表一次。

于 2013-05-15T15:26:10.447 回答