J'ai écrit ce code ci-dessous et j'ai un problème avec la boucle while, elle parcourt la liste mais quand elle trouve un type de données autre que les chaînes qu'elle casse et imprime, j'en ai besoin pour parcourir tous les éléments de la liste.
counter = 0 index = 0 a = ['some', 'apple', 'banana', lambda a: a, 'pear', None, 'cherry', """Hello world!""", '''The Who''', ("a", 5), [("a", "5"), ("b", 3)]] while type(a[index]) == str: counter += 1 index += 1 print("There are {} strings in the list".format(counter))
7 Réponses :
La condition que vous avez définie pour la boucle while est en fait ce que vous cherchez à compter, donc elle se brise dès qu'elle trouve la première. Il existe une autre approche qui pourrait mieux convenir à cela. Chaque fois que vous avez un objet qui peut être itéré, la chose la plus simple à utiliser est une boucle for. Dans ce cas, il passera par chaque élément de la liste et vous pourrez ensuite utiliser cet élément dans la boucle.
Vous pouvez donc ajuster le code pour parcourir toute la liste et la compter comme suit:
for i in a: if type(i) == str: counter += 1
Vous devez parcourir tous les éléments et "vérifier" s'ils correspondent à votre condition
counter = 0 a = ['some', 'apple', 'banana', lambda a: a, 'pear', None, 'cherry', """Hello world!""", '''The Who''', ("a", 5), [("a", "5"), ("b", 3)]] for elem in a: if type(a) is str: counter += 1 print("There are {} strings in the list".format(counter))
Quelques choses ont changé.
for
loop est utilisé à la place de while
. Vous devez tout boucler, c'est donc un meilleur choix ici. Vous pouvez toujours faire la même chose en utilisant while
, mais pas aussi propre.is
utilisé à la place de ==
. Pour la correspondance exacte de type, is
plus rapide et presque toujours meilleur que ==
Lorsque le premier non- str
est trouvé, type(a[index]) == str
False
et l'exécution se poursuit avec l'instruction suivante print
.
Comme d'autres l'ont mentionné, vous devez boucler sur tous les éléments.
Une façon d'obtenir votre résultat est:
>>> a = ['some', 'apple', 'banana', lambda a: a, ... 'pear', None, 'cherry', """Hello world!""", ... '''The Who''', ("a", 5), [("a", "5"), ("b", 3)]] >>> >>> print(f'There are {sum(type(e)==str for e in a)} strings in the list') >>> There are 7 strings in the list
que dis-tu de ça:
len([elem for elem in a if isinstance(elem, str)])
une manière plus efficace serait d'utiliser un dictionnaire ou un fichier json.
vous devez d'abord vérifier si l'élément de la liste est une autre liste, ou un touple et une boucle dessus, puis vérifier à nouveau s'il s'agit d'une liste ou un touple et une boucle dessus à nouveau, et pour obtenir la valeur de cela, boucle à nouveau . 4 boucles imbriquées seraient nécessaires. Un dictionnaire serait plus facile à manipuler. De plus, vous avez un tableau de types mixtes, comme vous le savez peut-être, l'instruction print n'imprime que des chaînes, vous devez donc convertir en chaîne avant l'impression ou l'échec du programme.
Les autres solutions ici n'évaluent que le premier niveau de chaînes dans l'objet a
. Cela ne renvoie que 7 chaînes mais dans l'exemple d'objet il y a un total de 11 chaînes.
Vous trouverez ci-dessous un exemple de méthode qui examine de manière récursive l'objet en recherchant toutes les chaînes, même si elles se trouvent à l'intérieur d'un autre itérable.
Considérez cette méthode:
def is_string(input: any) -> int: count = 0 if isinstance(input, str): count += 1 if isinstance(input, (list, tuple)): for e in input: count += is_string(e) if isinstance(input, dict): for k in input.keys(): count += is_string(k) for v in input.values(): count += is_string(v) return count >>> is_string(a) 11
is_string
accepte un paramètre et détermine s'il s'agit d'une chaîne. Si tel est le cas, il compte et revient. Si toutefois l'entrée est une interable, elle s'appelle elle-même et passe dans l'interable. Vous remarquerez peut-être que nous vérifions si les clés et les valeurs des dictionnaires sont également des chaînes.
Utilisez simplement cette boucle while, cela résoudra votre problème
while index < len(a): if type(a[index])==str: counter += 1 index += 1
La première fois que vous rencontrez une non-chaîne dans votre liste, le
type(a[index]) == str
? Par conséquent, la boucle continuera-t-elle? Pourrait-il y avoir plus de chaînes dans la liste après cette non-chaîne? Par conséquent, la boucle doit -elle continuer?"J'en ai besoin pour parcourir tous les éléments de la liste." Alors, quelle est la règle qui vous indique la valeur maximale d'
index
à utiliser?Je suggérerais d'utiliser une boucle for pour parcourir tous les éléments.