Как сделать функцию поиска дубликатов в символьной строке? - PullRequest
0 голосов
/ 23 мая 2018

Вот код, который я написал, чтобы найти повторяющиеся символы и затем заменить их на ')', а оригинальные символы на '(' в строке, и он должен игнорировать заглавные буквы.

def duplicate_finder(word):
    word1 = word.lower();
    w = list(word1);
    w1 = '';
    for i in range(0, len(word1)):
        if ([v in word1.replace(w[i], '') for v in w[i]]==[True]):
            w1 += ')';    
        else:
            w1 += '(';
    return (w1)

Но эта функциявсегда возвращает меня '((((((... ((' [до количества символов во входной строке]. Может кто-нибудь указать мне ошибку в моем коде !!! Заранее спасибо.

Ответы [ 7 ]

0 голосов
/ 23 мая 2018
# Find duplicate characters in a string by following conditions:
# - the first (original) character will replaced by '('
# - all others matches will replaced by ')'
# - all in a string with ignore capitalization

def duplicate_finder(word):
    s = word.lower()
    for ch in s:
        if s.count(ch)  >  1:    # is there more copies of this one character ?
            s = s.replace(ch, '(', 1).replace(ch, ')') # the first match will replaced by '(' character, and then all other matches will replaced by ')' character
    return s

print 'result: ' + duplicate_finder('hello world')     # result: he()( w)r)d
#                                    0123456789A                 0123456789A

Новый код (по комментарию Сатья - в 23:26):

# Find duplicate characters in the string by following conditions:
# - all single characters will replaced by '('
# - all multiple characters (duplicates) will replaced by ')'
# - input string must ignore capitalization

def duplicate_finder(word):
    s = word.lower()
    for ch in s:
        if s.count(ch)  >  1:         # is there more copies of this one character ?
            s = s.replace(ch, ')' )   # replace all matched ch by ')'
        else:
            s = s.replace(ch, '(', 1) # replace this one matched ch by '(' - there's only one character
    return s

print 'result: ' + duplicate_finder('hello world')     # result: (()))(()()(
#                                    0123456789A                 0123456789A
0 голосов
/ 23 мая 2018

@ Satya , я использовал концепцию Counter контейнера коллекций модуля в Python для решения вашей проблемы.

Счетчик - это подклассдиктатаСледовательно, это неупорядоченная коллекция, в которой элементы и их соответствующие значения хранятся в виде словаря.Это эквивалентно сумке или мультимножеству других языков.

Примечание : Не забудьте проверить ссылки на Счетчик , который указан в самом низу этого ответа, ипрокомментируйте, если найдете какие-либо трудности.

Посмотрите на приведенный ниже код.

"""
    StkOvrFlw link: /11327083/kak-sdelat-funktsiy-poiska-dublikatov-v-simvolnoi-stroke
    Aim: [
            '1. Here, original character means the character which '
                'is first time appearing in the string'
            '2. Replacing original character with => ('
            '3. If there are more occurences of original character'
                then replace them with => )'
    ]
    References: http://www.pythonforbeginners.com/collection/python-collections-counter
"""
from collections import Counter

# Code
def duplicate_finder(word):
    word = word.lower()
    i = 1;

    for ch, count in Counter(word).items():
        # print '(', i, ') Original character: \'', ch, '\'with', count - 1, 'more occurence(s)'
        if count == 1:
            word = word.replace(ch, '(') # Only 1 occurence of original character   
        else:
            l = list(word)
            l[word.find(ch)] = '('       # Replace original character with (
            word = ''.join(l) 
            word = word.replace(ch, ')') # Replace other occurences of original character with )

        # print 1, 'occurence of \'', ch, '\' replaced with \'(\' and remaining ', count - 1, ' occurence(s) with \')\''
        # print 'Iteration ', i, ' gives: ', word, '\n'
        i += 1
    return word

# Test case 1
print "I/P:  abaccccsgfsyetgdggdh"
print "O/P: ", duplicate_finder('abaccccsgfsyetgdggdh')
"""
I/P:    abaccccsgfsyetgdggdh
O/P:    (()()))((()((()()))(
"""

# Test case 2
print "\nI/P:  AAABBBCCC34519543absd67das1729"
print "O/P: ", duplicate_finder('AAABBBCCC34519543absd67das1729')
"""
I/P:    AAABBBCCC34519543absd67das1729
O/p:    ())())())((((()))))(((()))))()
"""

Ссылки : Вы можете найти хорошие статьи на Счетчик контейнер Python по адресу:

http://www.pythonforbeginners.com/collection/python-collections-counter и

https://www.geeksforgeeks.org/counters-in-python-set-1/

0 голосов
/ 23 мая 2018
def duplicate_finder(word):
    word1 = word.lower();
    w1 = '';
    length = len(word1)
    for i in range(0, length):
        w2 = word1[i]
        if(word1[i] != ")"):
            word1 = word1.replace(word1[i],"(",1)
        for v in range(i+1,length):
            if(word1[v] != ")" and word1[v] != "("):
                if (word1[v] == w2):
                    word1 = word1.replace(w2,")")
    return (word1)
0 голосов
/ 23 мая 2018

def duplicate_finder(word): word = word.lower() l = len(word) for i in range(l): index = word.find(word[i], i+1) if index != -1 and word[i] !=')': word = word.replace(word[i], '(', 1) word = word.replace(word[index], ')', 1) return (word)

Тест: я дал ввод как "Санжана" Снимок вывода с шагами замены

Это привело к s ((j)) a

Примечание: word[i] != ')' проверка необходима, поскольку существует возможность замены уже существующего ) в невидимом сегменте строки, что может привести к странным выводам

Редактировать

def duplicate_finder(word): word = word.lower() l = len(word) for i in range(l): index = word.find(word[i], i+1) if word[i] not in [')', '('] : if index != -1: word = word.replace(word[i], ')') else: word = word.replace(word[i], '(') return (word)

0 голосов
/ 23 мая 2018

Вот возможное решение:

def duplicate_finder(word):
    word1 = word.lower()
    w1 = ''
    found_chars= set([])
    for c in word1:
        if c in found_chars:
            w1+=')'
        else:
            found_chars.add(c)
            w1+='('
    print w1
0 голосов
/ 23 мая 2018

Запускаемый цикл всегда дает False, потому что: word1.replace(w[i],'') заменяет все экземпляры w[i] в word1.Поэтому, когда вы ищите v in word1.replace(w[i],''), он не находит ничего, поскольку вы связали их все.Это вызывает w1 += '(' каждый раз!


Вы можете сделать:
>>> def duplicate_finder(word):
...     word1 = word.lower();
...     w = list(word1);
...     w1 = '';
...     for i in range(0, len(word1)):
...         if ([v in word1[:i]+word1[i+1:] for v in w[i]]==[True]):
...             w1 += ')';
...         else:
...             w1 += '(';
...     return (w1)
...
>>> duplicate_finder('hello')
'(())('

Я бы сделал это другим способом, включив счетчик словаря, чтобы получить истинное значение O (n) algo

0 голосов
/ 23 мая 2018

Вот один из способов (при условии, что я понимаю вопрос):

def duplicate_finder(word):
    word1 = word.lower();
    for c in word1:
        # If more that one occurence of c
        if 1 != word1.count(c):
            # Replace all c with (
            word1 = word1.replace(c, '(')
        # Only one occurence
        else:
            word1 = word1.replace(c, ')')
    return word1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...