【发布时间】:2017-08-17 05:50:49
【问题描述】:
我正在使用以下内容:http://deron.meranda.us/data/nicknames.txt,其中包含大多数名称的昵称。我是这样使用的:
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'],即对于字典中根本没有出现的名称(在键或值中),那么输出列表应该仍然具有该名称。
我怎么得到它?
更新:
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 你是什么意思?
-
不要将名称添加到另一个列表,而是使用
set。这就是套装的用途。 -
当你发布一个问题时,请尽量减少它的必要性。整个第一段和代码 sn-p 可以替换为“我有一个将昵称映射到名称的字典”以及该字典的一个小样本。如果你这样做了,我们可以复制+粘贴字典并使用它。现在我们必须下载该 txt 文件,复制您的代码 sn-p,修复文件路径并运行代码以获取可以使用的 dict。这也会让你的问题更清楚 - 有一段时间我不确定你的第二个代码 sn-p 是否按预期工作。
-
包括您的 dict 以便清楚理解
标签: python dictionary key-value