2017-08-17 14 views
0

私は次のものを使用しています:http://deron.meranda.us/data/nicknames.txtほとんどの名前にニックネームがあります。次のように私はそれを使用しています:辞書の値リストから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) 

これは、そのキーの値のリストなどのキーとそのすべてのニックネーム実際の名前辞書を返します。

さて、私はその後、私は出力に

namelist = ['KEN', 'KENNY', 'KENNETH', 'MITCH', 'MITCHELL', 'LIZ', 'LIZZIE', 'ELIZABETH'] 

をしたいたとき、私はによって行うことができるよ唯一異なる名前すなわち、['KENNETH', 'MITCHELL', 'ELIZABETH']、:しかし

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) 

、私はまた、 ['KEN', 'KENNY', 'MITCH', 'MITCHELL', 'LIZ', 'LIZZIE', 'ELIZABETH']のようなケースを処理したい場合は、['KEN', 'MITCHELL', 'ELIZABETH']という2つのニックネーム「KEN」と「KENNY」が同じキーに属するので、それらを1つとみなして最終的なリストに1つしか入れません。また、['KENNETH, 'ZHAO', 'MITCH', 'MITCHELL']という名前リストがある場合、それは出力する必要があります:['KENNETH', 'ZHAO', 'MITCHELL']つまり、辞書にはまったく(キーまたは値のいずれでも)存在しない名前の場合、出力リストにはその名前が残っているはずです。 どうすれば入手できますか?

UPATE:

outdict = {'KENNETH': ['KEN', 'KENNY'], 'MITCHELL': ['MITCH'], 'ELIZABETH' : ['LIZ', 'LIZZIE'], .....} 

namelist1 = ['KEN', 'KENNY', 'KENNETH', 'MITCH', 'MITCHELL', 'LIZ', 'LIZZIE', 'ELIZABETH'] 

output1 = `['KENNETH', 'MITCHELL', 'ELIZABETH']` 

は私が入れているコードから上記の出力を取得しています。

namelist2 = ['KEN', 'KENNY', 'MITCH', 'MITCHELL', 'LIZ', 'LIZZIE', 'ELIZABETH']` 

output2 = `['KEN', 'MITCHELL', 'ELIZABETH']` 

namelist3 = ['KENNETH, 'ZHAO', 'MITCH', 'MITCHELL']` 
output3 = `['KENNETH', 'ZHAO', 'MITCHELL']` 

は自分自身を答えを得た:名前リストである場合には、以下のように

はしかし、私はまた、次の出力を得ることができるようにしたい

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

セットに "実際の" 名前を追加しますか? – wmorrell

+0

@wmorrellどういう意味ですか? – Rajiv

+0

別のリストに名前を追加するのではなく、 'set'を使います。それが何のためのものなのです。 – wmorrell

答えて

0

はこれを試して、

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) 

あなたのdictオブジェクトを置かない場合

+0

私のdictオブジェクトと必要なアウトプットも含めて質問を更新しました。私はそれが今より明確であることを願っています。 – Rajiv

+0

あなたのコードはdictをまったく使用しておらず、間違った出力を与えています。 – Rajiv

0

dictにリストを追加してからキーを返すことができますが、より良い方法が必要です。

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()) 

出力

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

名前リストが['KEN'、 'KENNY'、 'MITCH'、 'MITCHELL'、 'LIZ'、 'LIZZIE'、 'ELIZABETH'] ' の場合、出力は '[' KEN '、' MITCHELL '、' ELIZABETH ']' – Rajiv

+0

質問をより明確に更新しました – Rajiv

関連する問題