如何在Python 3中的字符串中查找重复项?

时间:2019-07-19 18:41:59

标签: python python-3.x string python-3.6

我的目标是找到字符串中的重复字符,并用其他值替换那些唯一和不唯一的元素,并将这些其他值放在另一个字符串中。

我使用了Counter,但这是到目前为止我得到的:

from collections import Counter

def duplicate_encode(word):
    word = word
    final_result = ""
    dict_input = Counter(word)
    print(dict_input)
    print(dict_input.items())
    for key in dict_input:
        x = int(dict_input[key])
        print("this is key" + "\t" + key)
        print(x)
        if x == 1:
            final_result += "("
        elif x != 1:
            final_result += ")"
    print("'" + final_result + "'")

duplicate_encode("binaryy")

输出:

'((((()'

例如,对于"binaryy",输出应为'((((())',而不是'((((()'

而且,比起print("'" + final_result + "'")

,还有一种更好的方式来打印字符串吗?

2 个答案:

答案 0 :(得分:1)

在您的原始方法中,您执行for key in dict_input:时要遍历计数器的键,因此最终将创建一个等于计数器中键的长度的字符串,即{{1} },如您在输出中观察到的。

而且字典仅是insertion-ordered的Python3.6 +版本,因此无论如何您都无法遍历可无序重新创建原始字符串的键。

相反,一旦创建了计数器,就需要遍历每个字符,并根据字符的计数是1还是大于1,向字符串中添加((((()(

对于带引号的打印,您也可以使用f字符串或字符串格式来返回带有引号的输出

)

输出将为

from collections import Counter

def duplicate_encode(word):

    counter = Counter(word)

    #Add ( if the count of character is 1, else add )
    output = ''.join('(' if counter.get(c) == 1 else ')' for c in word)

    #Return a f-string with single quotes around it
    return f"'{output}'"

    #Or use string formatting
    #return "'{}'".format(output)

print(duplicate_encode("binaryy"))

答案 1 :(得分:1)

您的循环不应超过for key in dict_input:。这只能靠运气在您的示例中起作用,因为A)字典在Python 3.6+中排序,并且B)您只有一个范围的重复项。循环应将实际字符编码为字符串:

final_result = ''
for c in word:
    final_result += '(' if dict_input[c] == 1 else ')'

您可以(可能应该)将其缩短为

final_result = ''.join('(' if dict_input[c] == 1 else ')' for c in word)

要打印带引号的字符串,只需使用repr。直接:

print(repr(final_result))

或使用格式:

print(f'{final_result!r}')