1
votes

Diviser la liste des noms par sexe

J'ai un problème avec mon code. Je dois créer une fonction qui donne une liste de noms (masculin et féminin) crée deux nouvelles listes.

L'une avec le mâle et l'autre avec les noms féminins. Le problème est que ce sont des noms polonais, donc les noms féminins se terminent par a .

Voici ce que j'ai jusqu'à présent:

names = ["Andrzej", "Henryk", "Alicja", "Cezary", "Barbara"]
names.sort()

print(names)

def name_sorter(names):
    male =sorted(key=lambda x:x.split[-1])

print(name_sorter(names)) 


2 commentaires

ce que vous décrivez comme problème est en fait une très bonne nouvelle ; il fait passer du cauchemar au morceau de gâteau.


Mais notez que dire les noms féminins se terminent par "a" ne revient pas à dire que tous les noms qui se terminent par "a" sont des noms féminins .


8 Réponses :


1
votes
female_names = [i for i in names if i.endswith('a')]

0 commentaires

1
votes

Si vous avez votre liste de noms , vous pouvez simplement la parcourir et ajouter des hommes à une liste et des femmes à une autre:

females.sort()
males.sort()

Et puis vous pouvez triez-les si vous le souhaitez comme d'habitude:

names = ["Andrzej", "Henryk", "Alicja", "Cezary", "Barbara"]
males = []
females = []
for name in names:
    if name[-1] == 'a':
        females.append(name)
    else:
        males.append(name)


1 commentaires

Pourquoi faire deux tris à la fin alors que vous pourriez en faire un au début?



1
votes
names = ["Andrzej", "Henryk", "Alicja", "Cezary", "Barbara"]

females = [name for name in names if name[-1] == 'a']
males = [name for name in names if name not in females]

0 commentaires

0
votes
names = ["Andrzej", "Henryk", "Alicja", "Cezary", "Barbara"]
for name in names:
    if name.endswith("a") == True:
        print("F")
    else:
        print("M")

2 commentaires

Cela ne "divise" pas la liste.


Veuillez décrire ce que vous avez changé et pourquoi, pour aider les autres à identifier le problème et à comprendre cette réponse



1
votes

Vous pouvez utiliser str.endswith():

['Andrzej', 'Henryk', 'Cezary'] ['Alicja', 'Barbara']

Output:

names = ["Andrzej", "Henryk", "Alicja", "Cezary", "Barbara"]

males = []
females = []

for name in names:
    if name.endswith("a"):
        females.append(name)
    else:
        males.append(name)

print(males, females)


0 commentaires

1
votes

Utilisation de str.endswith () : < pré> XXX


0 commentaires

2
votes
females = []
males = []
for name in names:
    if name.endswith("a"):
        females.append(name)
    else:
        males.append(name)

0 commentaires

2
votes

Vous pouvez le faire avec une seule instruction dans une boucle avec:

from itertools import groupby

names = sorted(["Andrzej", "Henryk", "Alicja", "Cezary", "Barbara"])

males, females = [], []
for sex, firstnames in groupby(names, lambda name: name[-1] == "a"):
    [males, females][sex].extend(firstnames)

Voici une autre possibilité qui reste très lisible (si vous comprenez Python):

males = []
females = [name for name in names if name[-1] == "a" or males.append(name)]


0 commentaires