我使用以下: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)
添加了 「實際」 的名字到一組? – wmorrell
@wmorrell你是什麼意思? – Rajiv
而不是將名稱添加到另一個列表,使用'set'。這就是爲什麼。 – wmorrell