好的,所以我想要的是计算给定密码的功率。每个“cddd”给出20次幂,“cdd”10和“cd”5。事情是它们不能重叠。所以如果我们取字符串“cdddd”,它将有20个幂而不是35个。
我的解决方案有效,但它太丑了,我根本不喜欢它。它应该更通用而不是只匹配一个特定的字典:/
我只是对dict进行排序所以它从最长的子字符串开始,遍历dict,然后从原始密码中删除子字符串。我想知道我还能如何处理它。
感谢您的任何建议:)
import re
import collections
def passwordCalculator(password):
passwordPower = 0
initialDict = {"cddd": 20, "cdd": 10,"cd": 5}
phrases = collections.OrderedDict(sorted(initialDict.items(), key=lambda t: len(t[0]), reverse=True))
for phrase in phrases.keys():
count = (len(re.findall(phrase, password)))
passwordPower += phrases.get(phrase) * count
password = str.replace(password, phrase, '')
return passwordPower
答案 0 :(得分:1)
一种可能性是使用递归:
initialDict = {"cddd": 20, "cdd": 10,"cd": 5}
def calc_power(password, score=0):
if any(i in password for i in initialDict):
options = filter(lambda x:x in password, initialDict)
return calc_power(password[:password.index(max(options))]+password[password.index(max(options))+len(max(options)):], score + initialDict[max(options)])
return score
passwords = ['cdddd', 'cddd', 'cd', 'cdd']
final_results = {i:calc_power(i) for i in passwords}
输出:
{'cdd': 10, 'cddd': 20, 'cdddd': 20, 'cd': 5}
答案 1 :(得分:0)
您可以创建一个包含所有短语的正则表达式(按长度递减顺序排列),由|
分隔。因此,您的代码可以保持phrases
列表的原样:
def passwordCalculator(password):
initialDict = {"cddd": 20, "cdd": 10,"cd": 5}
phrases = collections.OrderedDict(sorted(initialDict.items(), key=lambda t: len(t[0]), reverse=True))
regex = '|'.join(re.escape(phrase) for phrase in phrases)
return sum(initialDict[match] for match in re.findall(regex, password))
答案 2 :(得分:0)
使用正则表达式怎么样?它能解决您的问题还是必须链接到 initialDict键?
import re
password = 'ccdddddvvvvvdcd'
p = re.compile(r'cd{1,3}')
result = sum(initialDict.get(x, 0) for x in p.findall(password))