我是python的新手,我想知道如何发现一个键是字典中另一个键的子字符串。我有一个字典的例子:
dictionary = {'modulus of elasticity': 24, 'cross validation': 16, 'mechanical properties': 16, 'elasticity': 2}
我试过的代码:
for k in dictionary.keys():
res = [ d for d in dictionary.keys() if d in k ]
if res:
if(len(d) > len(k)):
print(d,"is longer than ", k)
else:
pass
对于我的代码,我知道它会得到错误,NameError: name 'd'没有定义事实上,我不知道如何捕捉k和d的值,当它们之间有一个子字符串。在我的例子中,我想循环遍历字典中的键,并验证当前键是否为整个字典中另一个键的子字符串。例如,如果第一个键像弹性模量我想检查它旁边的其他键是否包含它直到字典结束当然,当我们循环untilelasticity时我们会看到弹性是弹性模量的子串但反之亦然。在本例中,我想捕获键和和键弹性模量在if
语句中打印:弹性模量大于弹性模量或者在其他情况下,我也想操纵它们的值。如何做到这一点?任何帮助将非常感激!谢谢!
你需要做的是:
-
从字典中获取所有键
-
对于每个键,搜索看看它是否是另一个键的子字符串。如果是这样,打印出来。否则转到下一个
keys = list(dictionary.keys()) for key in keys: for other_key in keys: if key == other_key: continue else: if key in other_key: print(key + ' is a substring of ' + other_key)
d
仅在列表推导式中定义,这里有一种更简单的方法来完成:
dictionary = {'modulus of elasticity': 24, 'cross validation': 16, 'mechanical properties': 16, 'elasticity': 2}
for k in dictionary.keys():
for k2 in dictionary.keys():
if k != k2 and k in k2: print(k2 ,"is longer than ", k)
>>> modulus of elasticity is longer than elasticity
对字典的键进行两次循环,检查它们是否不是相同的键,否则验证一个键是否为另一个键的子字符串。
您不必每次循环迭代都从列表的开始扫描,这只是额外的CPU周期,相反,按键长度对列表排序,然后在每次迭代中从当前迭代值的下一项开始,按照以下代码:
>>> keys = sorted(dictionary.keys(), key=lambda k: len(k))
>>>
>>> for index, key_out in enumerate(keys):
for key_in in keys[index+1:]:
if (key_out in key_in) and (key_out != key_in):
print('[' + key_out + ']' + ' is a substring of [' + key_in + ']')
[elasticity] is a substring of [modulus of elasticity]