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

Python 字典是否包含包含多个部分字符串的键?,python,Python,我正在测试字典,看看它是否包含包含部分字符串的键。具体来说,我正在构建一个翅膀生成器,它将每根羽毛的控制权分配给一个字典。单击按钮镜像机翼时,我需要测试机翼是否已经镜像(然后测试它是否随后被撤消/删除,但这不是问题的一部分,很容易测试)。我希望通过检查feather字典来实现这一点,看看它是否有同时包含“L_”和“R_”的键 下面的代码符合我的要求,但相当冗长。必须有一种更简单、更优雅的方法: dict={} RS=False LS=False for each in dict: if

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

或者,创建另一个全局变量并将镜像的真/假值存储到该变量中以进行测试会更简单吗?我试图将全局变量控制在最小值,但不确定它们如何影响资源。如果您有任何建议,我们将不胜感激。

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


这样就不会出现此搜索问题。

这种方法不太冗长,在找到匹配的键时,有机会提前中断搜索,但在最坏的情况下,仍然会对键进行两次完整的传递

if any('L_' in key for key in dict) and any('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
注意:如果您希望
L_
R_
出现在同一个键中或不出现在同一个键中(例如:
“…L_…R_…”
),那么您的问题有点含糊不清。如果是这种情况,请使用:

if any('L_' in key and 'R_' in key for key in dict):
    print 'has both'
这种方式更加冗长,但会尽快爆发,即使在最坏的情况下也只能通过一次

if any('L_' in key for key in dict) and any('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)
结果生成一个集合,其中包含两个选项,您可以使用.issubset()的len()或其他选项轻松检查:

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

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

您确定代码符合您的要求吗?我想你的意思是
,如果每个:
中的“R_uu”,你重复
LS=True
,而不是
RS=True
。另外,如果LS和RS:在循环中,您是否打算使用
?如果是这样,您不需要在每次迭代中将LS和RS重置为False吗?如果你让代码正常工作,这里的人可以更容易地向你展示一种使代码更好的方法。我使用一个单独的方法创建羽毛(羽毛的数量是可变的),该方法单独创建每个羽毛,然后将控件名分配给字典。当我镜像时,我会根据对边字典的长度使用它的#of feather值运行相同的方法(然后它会运行新边的每个控件,并从对边的feather控件复制属性)。因为创建双方的方法相同,所以使用相同的字典。所以我不确定第二个feather字典是否实用,或者是否比“mirror test”全局变量更好。@Kratch如果是这样的话,听起来你不应该把两边分开。我发现您的描述太模糊,无法推荐更合适的数据结构,但我相信确实有。谢谢。看起来我离第二个选项不远了,但是知道不太详细的方法也不错。非常感谢。