2017-08-17 1 views
0

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) 
+0

Ajouter les noms "réels" à un ensemble? – wmorrell

+0

@wmorrell Que voulez-vous dire? – Rajiv

+0

Au lieu d'ajouter des noms à une autre liste, utilisez 'set'. C'est ce que les ensembles sont pour. – wmorrell

Répondre

0

essayer cela,

def getOddout(st): 
    out = [] 
    for s in st: 
     if not any([s in r for r in st if s != r]): 
      out.append(s) 
    return out 
namelist = ['KEN', 'KENNY', 'KENNETH', 'MITCH', 'MITCHELL', 'LIZ', 'LIZZIE', 'ELIZABETH'] 
print getOddout(namelist) 

si ce n'est pas mis votre objet dict

+0

Mise à jour de la question pour inclure mon objet dict et les sorties nécessaires. J'espère que c'est plus clair maintenant. – Rajiv

+0

Votre code n'utilise pas le dict et donne une mauvaise sortie complètement. – Rajiv

0

L'ajout des listes à un dict et ensuite le retour des clés fonctionne, mais il doit y avoir un meilleur moyen.

l = load_names() 
e = {} 
for k, v in l.items(): 
    for n in namelist: 
     if n in v and k not in e: 
      e[k] = v 
print('dict', e.keys()) 

Sorties

['ELIZABETH', 'MITCHELL', 'KENNETH'] 
+0

À droite mais si la liste de noms est ['KEN', 'KENNY', 'MITCH', 'MITCHELL', 'LIZ', 'LIZZIE', 'ELIZABETH'] ' alors je veux que la sortie soit' ['KEN ',' MITCHELL ',' ELIZABETH '] ' – Rajiv

+0

J'ai mis à jour la question pour être plus clair – Rajiv