【问题标题】:Finding strings differing by one character in dictionary在字典中查找相差一个字符的字符串
【发布时间】:2021-05-09 20:51:00
【问题描述】:

我有一个字典,其中包含作为键的字符串以及它们在文件中作为值出现的次数。我正在尝试找到一种方法来查找相差一个字符的字符串,然后从字典中删除计数最低的字符串。

从这里:

dictionary = {'ATAA':5, 'GGGG':34, 'TTTT':34, 'AGAA':1}

到这里:

new_dictionary = {'ATAA':5, 'GGGG':34, 'TTTT':34}

字典很大,所以我试图找到一种有效的方法来解决这个问题。任何关于如何解决它的建议都将非常感激。

【问题讨论】:

标签: python dictionary


【解决方案1】:

这将是我的自制食谱。首先,我们收集所有具有唯一字符的键。然后我们按键对这个新字典进行排序。在您的情况下,我们将以 {'AGAA': 1, 'ATAA': 5} 结尾,这意味着我们可以将 AGAA 从字典中删除。

import collections
dic = {'ATAA':5, 'GGGG':34, 'TTTT':34, 'AGAA':1}
del dic[list({k: v for k, v in sorted({k:v for k,v in dic.items() if len(set(k)) == 2}.items(), key=lambda item: item[1])}.keys())[0]]

输出

{'ATAA': 5, 'GGGG': 34, 'TTTT': 34}

现在还有更多。如果您有一些具有相似值的键怎么办。上面的代码将不起作用。我花了最后几分钟编写了一些新代码。

我会分解的。

import collections
from collections import defaultdict
#----------
#This will give us {'ATAA': 5, 'AGAA': 5}, we have located the different keys
dictionary = {'ATAA':5, 'GGGG':34, 'TTTT':34, 'AGAA':5}
lowest =  {k: v for k, v in sorted({k:v for k,v in dictionary.items() if len(set(k)) == 2}.items(), key=lambda item: item[1])}
#----------
#This will give us ['ATAA', 'AGAA']. Checks for all keys with similar values.
grouped = defaultdict(list)
for key in lowest:grouped[lowest[key]].append(key)
simKeys = min(grouped.values(), key=len)
#----------
#This will check if we have to delete many keys or just one
if len(simKeys) > 1:x = {k:v for k,v in dictionary.items() if k not in simKeys}
if len(simKeys) == 1:del dictionary[list(lowest.keys())[0]]
#----------

【讨论】:

  • 感谢 BuddyBob!如果我有以下字典怎么办:dictionary = {'ATAA':53, 'GGGG':34, 'GCGG':3, 'AGAA':5}。然后我想要以下输出:dictionary = {'ATAA': 53, 'GGGG': 34}。在您所做的解决方案中,只进行了一次比较。
  • 为什么会这样? GCGG 是最低的不同键。我的输出是{'ATAA': 53, 'GGGG': 34, 'AGAA': 5}
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多