2017-08-17 172 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

相关问题