Python-按键中的汉明距离对defaultdict值进行分组

Python-按键中的汉明距离对defaultdict值进行分组,python,combinations,string-comparison,defaultdict,hamming-distance,Python,Combinations,String Comparison,Defaultdict,Hamming Distance,我有一个大约700键的默认dict。键的格式为_B_字符串。我需要做的是将键拆分为‘‘’,如果A和B相同,则比较每个键的‘字符串’之间的距离。如果距离是,我想我看到你的代码中有一个问题考虑了这个场景: 0: A_B_DATA1 1: A_B_DATA2 2: A_B_DATA3 All the valid comparisons are: 0 -> 1 * Combines under key 'A_B_DATA1' 0 -> 2 * Combines under

我有一个大约700键的默认dict。键的格式为_B_字符串。我需要做的是将键拆分为‘‘’,如果A和B相同,则比较每个键的‘字符串’之间的距离。如果距离是,我想我看到你的代码中有一个问题考虑了这个场景:

0: A_B_DATA1 
1: A_B_DATA2    
2: A_B_DATA3 

All the valid comparisons are:  
0 -> 1 * Combines under key 'A_B_DATA1' 
0 -> 2 * Combines under key 'A_B_DATA1'
1 -> 2 * Combines under key 'A_B_DATA2' **opps
0: A_B_DATA111
1: A_B_DATA122    
2: A_B_DATA223 

All the valid comparisons are:  
0 -> 1 * Combines under key 'A_B_DATA111' 
0 -> 2 * Combines under key 'A_B_DATA111'
1 -> 2 * Combines under key 'A_B_DATA122'
我想你会希望这三个在一个键下结合。然而,考虑这种情况:

0: A_B_DATA1 
1: A_B_DATA2    
2: A_B_DATA3 

All the valid comparisons are:  
0 -> 1 * Combines under key 'A_B_DATA1' 
0 -> 2 * Combines under key 'A_B_DATA1'
1 -> 2 * Combines under key 'A_B_DATA2' **opps
0: A_B_DATA111
1: A_B_DATA122    
2: A_B_DATA223 

All the valid comparisons are:  
0 -> 1 * Combines under key 'A_B_DATA111' 
0 -> 2 * Combines under key 'A_B_DATA111'
1 -> 2 * Combines under key 'A_B_DATA122'
现在它变得有点棘手,因为第0行距离第1行是距离2,第1行距离第2行是距离2,但您可能不希望它们都在一起,因为第0行距离第2行是距离3

下面是一个工作解决方案的示例,假设您希望输出是这样的:

def unpack_key(key):
    data = key.split('_')
    return '_'.join(data[:2]), '_'.join(data[2:])

combined = defaultdict(list)
for key1 in groups:
    combined[key1] = []
    key1_ab, key1_string = unpack_key(key1)
    for key2 in groups:
        if key1 != key2:
            key2_ab, key2_string = unpack_key(key2)
            if key1_ab == key2_ab and len(key1_string) == len(key2_string):
               if hamming(key1_string, key2_string) <= 2:
                   combined[key1].append(key2)

请记住,这是一个O(n^2)算法,这意味着当密钥集变大时,它是不可伸缩的。

您缺少一个“在您的hamming文档字符串中,它会导致格式错误,您可以将其放在其中吗?”?我会为您编辑它,但堆栈溢出需要至少6个字符的编辑:/changed。我对这个问题有什么想法吗?我明白你对关键问题的意思。我想我已经想出了一个解决方案,不使用itertools组合,请参见edit您能告诉我您对上述场景的输出预期是什么吗?输出应该是默认的dict,其中键包含通过上述标准的值:所有原始标题的值必须具有相同的a和B,每个字符串应该有所不同,但我觉得有多种方式来表示这个答案。你能告诉我输出应该是什么样的吗(生成的字典键/值是什么)。好的。假设键A_B_DATA111的列表中有10个序列,A_B_DATA122有7个,A_B_DATA223有4个。在最后的dict A_B_data中,111将是搜索具有上述条件的其他键的代表键。A_B_数据122应属于A_B_数据111。A_B_data 223,将根据其他键进行搜索。
A_B_DATA111: ['A_B_DATA122']
A_B_DATA122: ['A_B_DATA111', 'A_B_DATA223']
A_B_DATA223: ['A_B_DATA122']