Voici le code que j'ai écrit pour trouver des caractères en double, puis les remplacer par «)» et les caractères originaux par «(» dans une chaîne et il devrait ignorer la capitalisation.

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)

Mais cette fonction me renvoie toujours '(((((((... ((' [jusqu'au nombre de caractères dans la chaîne d'entrée]. Quelqu'un peut-il s'il vous plaît me signaler la faute dans mon code !!! Merci d'avance.

2
Satya Prakash Dash 23 mai 2018 à 13:09

7 réponses

Meilleure réponse

La boucle que vous exécutez donne toujours False car: word1.replace(w[i],'') remplace toutes les instances de w[i] dans word1. Ainsi, lorsque vous recherchez v in word1.replace(w[i],''), il n'en trouve aucun car vous les avez tous retracés. Cela appelle w1 += '(' à chaque fois!


>>> 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')
'(())('

Je le ferais d'une autre manière, en impliquant le décompte du dictionnaire pour obtenir un vrai O (n) algo

1
Tushar Aggarwal 23 mai 2018 à 10:26

Voici une façon (en supposant que je comprends la question):

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
1
Johnny Mopp 23 mai 2018 à 10:22
# 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

Nouveau code (par commentaire de Satya - à 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
s3n0 24 mai 2018 à 13:08

Voici une solution possible:

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
Elad 23 mai 2018 à 11:47
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
user2159471 23 mai 2018 à 10:55

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)

Tester: J'ai donné mon avis sur "Sanjana" Capture d'écran de sortie avec étapes de remplacement

Il en a résulté s ((j)) a

Remarque: La vérification word[i] != ')' est nécessaire car il existe une possibilité de remplacement de ) déjà existant dans le segment invisible de la chaîne, et peut donc produire une sortie étrange

Modifier

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)

1
Sanjana 24 mai 2018 à 06:14

@Satya , j'ai utilisé le concept de Conteneur module de conteneur de collections en Python pour résoudre votre problème.

Un compteur est une sous-classe de dict. Il s'agit donc d'une collection non ordonnée où les éléments et leur nombre respectif sont stockés sous forme de dictionnaire. Cela équivaut à bag ou multiset d'autres langues.

Remarque : n'oubliez pas de vérifier les références du compteur qui se trouvent tout en bas de cette réponse et de commenter si vous rencontrez des difficultés.

Jetez un œil au code ci-dessous.

"""
    StkOvrFlw link: https://stackoverflow.com/questions/50485559/how-to-make-a-function-to-find-duplicacy-in-a-character-string
    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:    ())())())((((()))))(((()))))()
"""

Références : vous pouvez trouver de bons articles sur le conteneur Counter de Python sur:

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

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

0
hygull 23 mai 2018 à 13:54