2017-08-17 146 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']即兩個暱稱'KEN'和'KENNY'屬於同一個關鍵字,所以我想將它們視爲一個,並且在最終列表中只有其中一個。另外,如果我有一個名爲['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) 

如果它沒有放你的字典對象

+0

更新了問題,以包括我的字典對象和需要的輸出。我希望現在更清楚。 – Rajiv

+0

你的代碼根本沒有使用字典,並完全給出錯誤的輸出。 – Rajiv

0

將列表添加到一個字典,然後返回鍵的作品,但必須有更好的方法。

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

相關問題