J'utilise ce qui suit: http://deron.meranda.us/data/nicknames.txt qui a les surnoms pour la plupart des noms. Je l'utilise comme suit:Correspondant élément de la liste de valeur dans un dictionnaire à un autre élément dans la même liste en python
def load_names():
with open('file.txt', 'r') as infile:
outdict = collections.defaultdict(list)
for i, line in enumerate(infile.readlines()):
tmp = line.strip().split('\t')
outdict[tmp[1]].append((tmp[0]))
return dict(outdict)
Ce retourne un dictionnaire où les noms réels que les clés et tous leurs surnoms comme une liste de valeurs pour cette clé.
Maintenant, quand j'ai un
namelist = ['KEN', 'KENNY', 'KENNETH', 'MITCH', 'MITCHELL', 'LIZ', 'LIZZIE', 'ELIZABETH']
alors je veux que la sortie des noms différents à savoir, ['KENNETH', 'MITCHELL', 'ELIZABETH']
, que je suis capable de faire par:
l = load_names()
temp =[]
for i in namelist:
v = l.get(i)
if v is not None:
l3 = [x for x in namelist if x not in v]
temp.append(l3)
print(temp)
s = set.intersection(*map(set,temp))
s = list(s)
print(s)
Cependant, j'ai aussi Je veux qu'il traite le cas comme ['KEN', 'KENNY', 'MITCH', 'MITCHELL', 'LIZ', 'LIZZIE', 'ELIZABETH']
, cela devrait sortir ['KEN', 'MITCHELL', 'ELIZABETH']
à savoir, les deux surnoms «KEN» et «KENNY» appartiennent à la même clé donc, je veux les considérer comme un seul et avoir un seul d'entre eux dans la liste finale. En outre, si j'ai une liste de noms comme ['KENNETH, 'ZHAO', 'MITCH', 'MITCHELL']
alors il doit afficher: ['KENNETH', 'ZHAO', 'MITCHELL']
, c'est-à-dire, pour les noms qui ne figurent pas dans le dictionnaire (en clé ou valeur), la liste de sortie doit toujours avoir ce nom. Comment l'obtenir?
Upate:
outdict = {'KENNETH': ['KEN', 'KENNY'], 'MITCHELL': ['MITCH'], 'ELIZABETH' : ['LIZ', 'LIZZIE'], .....}
namelist1 = ['KEN', 'KENNY', 'KENNETH', 'MITCH', 'MITCHELL', 'LIZ', 'LIZZIE', 'ELIZABETH']
output1 = `['KENNETH', 'MITCHELL', 'ELIZABETH']`
Je reçois la sortie au-dessus du code que je l'ai mis.
Cependant, je veux être en mesure d'obtenir les résultats suivants lorsque les listes de noms sont les suivants:
namelist2 = ['KEN', 'KENNY', 'MITCH', 'MITCHELL', 'LIZ', 'LIZZIE', 'ELIZABETH']`
output2 = `['KEN', 'MITCHELL', 'ELIZABETH']`
namelist3 = ['KENNETH, 'ZHAO', 'MITCH', 'MITCHELL']`
output3 = `['KENNETH', 'ZHAO', 'MITCHELL']`
moi-même obtenu la réponse:
l = load_names()
temp =[]
e = {}
for n in namelist:
if n in l.keys():
temp.append(n)
for ix in namelist:
for key, i in l.items():
if key in namelist:
continue
else:
b=0
if ix in i:
b=1
f=0
for x in temp:
if x in i:
f=1
break
if f == 0:
temp.append(ix)
break
b=0
for k2, loc in l.items():
if ix in loc:
b=1
break
elif ix == k2:
b=1
break
if b == 0:
temp.append(ix)
break
print(temp)
Ajouter les noms "réels" à un ensemble? – wmorrell
@wmorrell Que voulez-vous dire? – Rajiv
Au lieu d'ajouter des noms à une autre liste, utilisez 'set'. C'est ce que les ensembles sont pour. – wmorrell