【问题标题】:Removing values from dictionary that multiple keys share从字典中删除多个键共享的值
【发布时间】:2016-03-12 18:41:30
【问题描述】:

我有一个由title:substrings 构建的字典,其中前三个条目如下所示:

'1' : ['G', 'GA', 'GAA', 'GAAA', 'GAAAA', 'GAAAAA', 'GAAAAAG', 'GAAAAAGU', 'GAAAAAGUA', 'GAAAAAGUAU', 'GAAAAAGUAUG', 'GAAAAAGUAUGC', 'GAAAAAGUAUGCA', 'GAAAAAGUAUGCAA', 'GAAAAAGUAUGCAAG', 'GAAAAAGUAUGCAAGA', 'GAAAAAGUAUGCAAGAA', 'GAAAAAGUAUGCAAGAAC']

'2' : ['G', 'GA', 'GAG', 'GAGA', 'GAGAG', 'GAGAGA', 'GAGAGAG', 'GAGAGAGA', 'GAGAGAGAC', 'GAGAGAGACA', 'GAGAGAGACAU', 'GAGAGAGACAUA', 'GAGAGAGACAUAG', 'GAGAGAGACAUAGA', 'GAGAGAGACAUAGAG', 'GAGAGAGACAUAGAGG']

'3' : ['G', 'GU', 'GUC', 'GUCU', 'GUCUU', 'GUCUUU', 'GUCUUUG', 'GUCUUUGU', 'GUCUUUGU"', 'GUCUUUGU"G', 'GUCUUUGU"GU', 'GUCUUUGU"GUA', 'GUCUUUGU"GUAC', 'GUCUUUGU"GUACA', 'GUCUUUGU"GUACAU', 'GUCUUUGU"GUACAUC']

我找到了很多关于如何将它们转换为列表并创建一个 for 循环来检查 1 中的项目是否在其他中的答案,如果是,则删除它们,但我认为这对我来说不可行,因为这本字典是生成的,不是我手写的。因此,我真的不明白我应该如何解决这个问题。

【问题讨论】:

  • 我尝试创建一个值列表并尝试进行类似于“if item[0] in item[1]: d.remove[item[0]”的迭代,但是逻辑错误并吐出错误
  • 让我们看看我是否有这个权利,如果“G”在 1、2 和 3 中,你希望它从两个中的 2 个中删除,但保留在其中一个中。你在乎哪一个?这些值是像字符串一样的可散列对象吗?
  • @tdelaney 如果 G 在 1,2,3 中,我想将其从 1,2,3 中删除,以便在最后的列表 1,2 和 3 中每个仅包含以下字符串对他们来说是独一无二的(不在其他列表中)。这些值是字符串,是的

标签: python python-3.x dictionary duplicates unique


【解决方案1】:

您可以建立一个索引,其中每个值都列出了它所在的键。如果该列表大于 1,则删除该值。

mydict = {
'1' : ['G', 'GA', 'GAA', 'GAAA', 'GAAAA', 'GAAAAA', 'GAAAAAG', 'GAAAAAGU', 'GAAAAAGUA', 'GAAAAAGUAU', 'GAAAAAGUAUG', 'GAAAAAGUAUGC', 'GAAAAAGUAUGCA', 'GAAAAAGUAUGCAA', 'GAAAAAGUAUGCAAG', 'GAAAAAGUAUGCAAGA', 'GAAAAAGUAUGCAAGAA', 'GAAAAAGUAUGCAAGAAC'],

'2' : ['G', 'GA', 'GAG', 'GAGA', 'GAGAG', 'GAGAGA', 'GAGAGAG', 'GAGAGAGA', 'GAGAGAGAC', 'GAGAGAGACA', 'GAGAGAGACAU', 'GAGAGAGACAUA', 'GAGAGAGACAUAG', 'GAGAGAGACAUAGA', 'GAGAGAGACAUAGAG', 'GAGAGAGACAUAGAGG'],

'3' : ['G', 'GU', 'GUC', 'GUCU', 'GUCUU', 'GUCUUU', 'GUCUUUG', 'GUCUUUGU', 'GUCUUUGU"', 'GUCUUUGU"G', 'GUCUUUGU"GU', 'GUCUUUGU"GUA', 'GUCUUUGU"GUAC', 'GUCUUUGU"GUACA', 'GUCUUUGU"GUACAU', 'GUCUUUGU"GUACAUC']
}

# build a dict of values and the keys that hold them
tmpdict = defaultdict(list)
for key, values in mydict.items():
    for value in values:
        tmpdict[value].append(key)

# now remove offenders from the original list
for value, inkeys in tmpdict.items():
    if len(inkeys) > 1:
        for key in inkeys:
            mydict[key].remove(value)

print mydict

【讨论】:

  • 非常感谢 tdelaney!这工作得很好。我能问你我将如何删除一个列表中“GAAAA”的项目,因为 GAAAA 只是 GAA 的扩展(一开始就在列表中)?
  • 您可以将其破解为tmpdict[value].append(key),具体取决于您对真正扩展的规则。如果它像“我只关心前 3 个字母”那么简单,那就是tmpdict[value[:3]].append(key)。知道何时扩展的规则是什么?您可能不希望“GAA”成为“G”的扩展。
  • 基本上在删除所有重复出现的字符串后,列表总是从最小的第一个唯一字符串开始。所以在列表 1 中,这将是 GAA,但是接下来你会得到下一个任意多的字符串,只是在 GAA 之上添加了更多的 As。因此,GAA 将用作其他是否需要删除的基础。所以如果它是 GAA[+其他字母] 它将被视为扩展名并被删除
【解决方案2】:

当您需要扩展时,从列表中删除任意项会导致性能下降。通常最好从旧列表中创建新列表,并忽略要删除的项目。

在这里,您要删除的项目是计数大于 1 的值

>>> mydict = {
... '1' : ['G', 'GA', 'GAA', 'GAAA', 'GAAAA', 'GAAAAA', 'GAAAAAG', 'GAAAAAGU', 'GAAAAAGUA', 'GAAAAAGUAU', 'GAAAAAGUAUG', 'GAAAAAGUAUGC', 'GAAAAAGUAUGCA', 'GAAAAAGUAUGCAA', 'GAAAAAGUAUGCAAG', 'GAAAAAGUAUGCAAGA', 'GAAAAAGUAUGCAAGAA', 'GAAAAAGUAUGCAAGAAC'],
... '2' : ['G', 'GA', 'GAG', 'GAGA', 'GAGAG', 'GAGAGA', 'GAGAGAG', 'GAGAGAGA', 'GAGAGAGAC', 'GAGAGAGACA', 'GAGAGAGACAU', 'GAGAGAGACAUA', 'GAGAGAGACAUAG', 'GAGAGAGACAUAGA', 'GAGAGAGACAUAGAG', 'GAGAGAGACAUAGAGG'],
... '3' : ['G', 'GU', 'GUC', 'GUCU', 'GUCUU', 'GUCUUU', 'GUCUUUG', 'GUCUUUGU', 'GUCUUUGU"', 'GUCUUUGU"G', 'GUCUUUGU"GU', 'GUCUUUGU"GUA', 'GUCUUUGU"GUAC', 'GUCUUUGU"GUACA', 'GUCUUUGU"GUACAU', 'GUCUUUGU"GUACAUC']
... }
>>> from collections import Counter
>>> from itertools import chain
>>> c = Counter(chain.from_iterable(mydict.values()))
>>> {k: [x for x in v if c[x] == 1] for k, v in mydict.items()}
{'1': ['GAA', 'GAAA', 'GAAAA', 'GAAAAA', 'GAAAAAG', 'GAAAAAGU', 'GAAAAAGUA', 'GAAAAAGUAU', 'GAAAAAGUAUG', 'GAAAAAGUAUGC', 'GAAAAAGUAUGCA', 'GAAAAAGUAUGCAA', 'GAAAAAGUAUGCAAG', 'GAAAAAGUAUGCAAGA', 'GAAAAAGUAUGCAAGAA', 'GAAAAAGUAUGCAAGAAC'],
 '3': ['GU', 'GUC', 'GUCU', 'GUCUU', 'GUCUUU', 'GUCUUUG', 'GUCUUUGU', 'GUCUUUGU"', 'GUCUUUGU"G', 'GUCUUUGU"GU', 'GUCUUUGU"GUA', 'GUCUUUGU"GUAC', 'GUCUUUGU"GUACA', 'GUCUUUGU"GUACAU', 'GUCUUUGU"GUACAUC'], 
 '2': ['GAG', 'GAGA', 'GAGAG', 'GAGAGA', 'GAGAGAG', 'GAGAGAGA', 'GAGAGAGAC', 'GAGAGAGACA', 'GAGAGAGACAU', 'GAGAGAGACAUA', 'GAGAGAGACAUAG', 'GAGAGAGACAUAGA', 'GAGAGAGACAUAGAG', 'GAGAGAGACAUAGAGG']}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 2012-02-18
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多