2017-10-20 10 views
1

J'ai créé une fonction pour compter une lettre, par exemple la lettre e. Ma fonction ressemble à quelque chose comme ceci:TypeError: doit être str, ne pas liste en Python 3 lors de l'appel d'une fonction

def count_letter(sentence, accents, case): 

    lower_case_e = ['e'] 
    upper_case_E = ['E'] 
    accent_lower_case = ['é', 'ê', 'è'] 
    accent_upper_case = ['É', 'Ê', 'È'] 

    for character in sentence:#If statement for optional argument where ignore_accents == True and ignore_case == False. 
     #This loop will count lower case and upper case e as differente letters but will treat accented characters the same. 

     if accents == True and case == False: 
      lower_case_count = sentence.count(lower_case_e) 
      accent_lower_case_count = sentence.count(accent_lower_case) 
      upper_case_count = sentence.count(upper_case_E) 
      accent_upper_case_count = sentence.count(accent_upper_case) 

      total_e_count = lower_case_count + accent_lower_case_count 
      total_E_count = upper_case_count + accent_upper_case_count 

      return {'Total number of lower case e in sentence ignoring accents':total_e_count, 'Total number of upper case E in sentence ignoring accents':total_E_count } 

Le point de cette fonction est de compter la lettre e et en fonction si elle est minuscule ou majuscule ou si elle a des accents, de résumer les lettres ensemble. J'ai créé un fichier texte appelé sentence.txt et il ressemble à ceci:

Testing if function can count letter e or E. 

J'ai lu le fichier en utilisant le code suivant:

# Reading the data from sentence.txt as a string 
with open('sentence.txt', 'r') as Sentence_file: 
    Sentence_string=Sentence_file.read().replace('\n', '') 

Et après avoir lu le fichier que je tente d'appeler la fonction de la manière suivante:

count_letter(sentence, True, False) 

Cependant, lorsque je tente d'exécuter ce que je reçois l'erreur suivante:

TypeError: must be str, not list 

Quelqu'un at-il une idée de ce qui pourrait mal se passer? L'erreur pourrait-elle être dans la façon dont je lis mon txt.file? Toutes les suggestions seraient grandement appréciées!

trace d'erreur complète ressemble à ceci:

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-2-b171590ddd67> in <module>() 
    29 with open('Test_Sentence1.txt', 'r') as Sentence1_file: 
    30  Sentence1=Sentence1_file.read().replace('\n', '') 
---> 31 count_letter_e(Sentence1, True, False) 
    32 

<ipython-input-2-b171590ddd67> in count_letter_e(sentence, accents, case) 
    18   if accents == True and case == False:#If statement for optional argument where ignore_accents == True and ignore_case == False. 
    19    #This loop will count lower case and upper case e as differente letters but will treat accented characters the same. 
---> 20    lower_case_count = sentence.count(lower_case_e)#counting lower case e with no accent from the sentence 
    21    accent_lower_case_count = sentence.count(accent_lower_case)#counting lower case e with accents from the sentence 
    22    upper_case_count = sentence.count(upper_case_E)#counting upper case E with no accent from the sentence 

TypeError: must be str, not list 
+2

Quelle est l'erreur exacte avec trace? – Carcigenicate

+0

Est-ce un problème de devoirs que vous recherchez? – pcurry

+1

Cette fonction est définitivement fausse. Soit vous allez inutilement parcourir votre boucle 'for' autant de fois qu'il y a de caractères dans votre phrase et finalement retourner' None' ou vous ne ferez qu'une seule itération de la boucle 'for'. –

Répondre

2

La fonction "count()" n'accepte qu'une chaîne comme entrée. Par exemple:

lower_case_count = 0 
for lower_case_e_char in lower_case_e: 
    lower_case_count += sentence.count(lower_case_e_char) 
print(lower_case_count) 
0

Vous attendez sentence.count() un string, pas une liste. Changez votre minuscule, majuscule etc. aux cordes. Par exemple, lower_case_e = 'e' au lieu de ['e']. Cela devrait résoudre votre erreur. Pour le reste, vous devez améliorer votre fonction de nombreuses autres façons.

vous pouvez essayer quelque chose comme:

lower_case_e = 'e' 
lower_case_count = sentence.count(lower_case_e) 
accent_lower_case_count = [sentence.count(item) for item in accent_lower_case] 
total_e_count = lower_case_count + sum(accent_lower_case_count) 

Vous pouvez le voir de message d'erreur. Regardez la ligne 31 puis 20, vous pouvez voir que quelque chose ne va pas avec phrase.count(). Puis inspectez le message d'erreur qui vous indique que quelque chose s'est mal passé car une liste a été vue par la fonction alors qu'elle attendait une chaîne. Ces pointeurs devraient vous aider à démarrer.

1

Dans la ligne indiquée dans la trace de la pile, vous appelez la méthode .count() et en passant dans la lower_case_e variable qui a une valeur de ['e']. La méthode .count() s'attend à ce qu'une chaîne compte, pas plusieurs valeurs. Exemple:

>>> testing = 'aba' 
>>> testing.count('a') 
2 
>>> testing.count(['a']) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: expected a string or other character buffer object 

Ainsi, pour les valeurs que vous voulez compter qui ont plusieurs caractères (tels que l'accent minuscules), vous devrez parcourir en boucle et ajouter la valeur de count() pour chaque méthode de chaîne, non la liste entière en même temps.

0

En fonction de la longueur de la chaîne que vous traitez, cela peut vous faire gagner un temps considérable à parcourir la chaîne une seule fois, en comptant vos caractères au fur et à mesure. Vous pouvez accumuler cette valeur manuellement, ou vous pouvez utiliser defaultdict pour effectuer l'accumulation.Vous pouvez ensuite ventiler vos totaux par les arguments requis après avoir effectué le comptage.

from collections import Counter 

def count_e(source, ignore_accents=False, ignore_case=False): 

    counts = Counter(source) 
    results = {} 

    lower_case_e = 'e' 
    upper_case_E = 'E' 
    accent_lower_case = ['é', 'ê', 'è'] 
    accent_upper_case = ['É', 'Ê', 'È'] 
    all_letters_e = [lower_case_e, upper_case_E] + accent_upper_case + accent_lower_case 

    lower_e_count = counts[lower_case_e] 
    upper_E_count = counts[upper_case_E] 

    if ignore_case and ignore_accents: 
     total = sum(counts[x] for x in all_letters_e) 
     key = 'Total number of E-shaped letters in sentence ignoring case and accents' 
     results[key] = total 
    elif ignore_case: 
     key = 'Total number of letter {} in sentence ignoring case' 
     results[key.format('E')] = upper_E_count + lower_e_count 

     for uc, lc in zip(accent_upper_case, accent_lower_case): 
      results[key.format(uc)] = counts[uc] + counts[lc] 
    elif ignore_accents: 
     key = 'Total number of {} case letter {} in sentence ignoring accents' 

     lower_accent_total = sum(counts[x] for x in accent_lower_case) 
     results[key.format('lower', lower_case_e)] = lower_e_count + lower_accent_total 

     upper_accent_total = sum(counts[y] for y in accent_upper_case) 
     results[key.format('upper', upper_case_E)] = upper_E_count + upper_accent_total 
    else: 
     key = 'Total number of letter {} in sentence' 
     for letter in all_letters_e: 
      results[key.format(letter)] = counts[letter] 
    return results