【问题标题】:Matching element from value list in a dictionary to another element in the same list in python将字典中的值列表中的元素与python中同一列表中的另一个元素匹配
【发布时间】: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


【解决方案1】:

试试这个,

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 对象

【讨论】:

  • 更新了问题以包括我的 dict 对象和所需的输出。我希望现在更清楚了。
  • 您的代码根本没有使用字典,并且完全给出了错误的输出。
【解决方案2】:

将列表添加到字典然后返回键是可行的,但必须有更好的方法。

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']

【讨论】:

  • 对,但如果名单是 ['KEN', 'KENNY', 'MITCH', 'MITCHELL', 'LIZ', 'LIZZIE', 'ELIZABETH']` 那么我希望输出成为['KEN', 'MITCHELL', 'ELIZABETH']
猜你喜欢
  • 1970-01-01
  • 2020-06-22
  • 2019-01-05
  • 2021-07-16
  • 2019-02-24
  • 2023-02-01
  • 2021-06-30
  • 2017-05-02
  • 2018-04-15
相关资源
最近更新 更多