Python重叠子串

时间:2018-02-02 18:59:14

标签: python

好的,所以我想要的是计算给定密码的功率。每个“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

3 个答案:

答案 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))