Python 如何在列表中找到重复次数最多的单词,但至少有一个差异

Python 如何在列表中找到重复次数最多的单词,但至少有一个差异,python,Python,如何在列表中找到重复次数最多的单词,但至少有一个不同 假设我有一个单词列表: my_list=['dog'、'cat'、'bat'、'cow'、'sheep'、'bot'、'dug'、'sheop'、'bag'、'cut'、'dat'] 因此,我的预期输出是: out ['cat', 'bat', 'bot', 'bag', 'dat'] 我知道有一个简单的方法可以做到这一点,但我不知道怎么做 感谢借助numpy和比较两个字符串的函数(来自SequenceMatcher),您可以计算每个单词元

如何在列表中找到重复次数最多的单词,但至少有一个不同

假设我有一个单词列表:

my_list=['dog'、'cat'、'bat'、'cow'、'sheep'、'bot'、'dug'、'sheop'、'bag'、'cut'、'dat']

因此,我的预期输出是:

out
['cat', 'bat', 'bot', 'bag', 'dat']
我知道有一个简单的方法可以做到这一点,但我不知道怎么做


感谢

借助numpy和比较两个字符串的函数(来自SequenceMatcher),您可以计算每个单词元组之间的距离。 然后你保留与其他所有单词最匹配的单词。最后,使用预计算的相似度返回相似的单词:

import numpy
from difflib import SequenceMatcher

my_list= ['dog', 'cat', 'bat', 'cow', 'sheep', 'bot', 'dug', 'sheop', 'bag', 'cut', 'dat']

def similar(a, b):
    return SequenceMatcher(None, a, b).ratio()

s = [0] * len(my_list)
m = numpy.zeros((len(my_list),len(my_list)))
for i, e in enumerate(my_list):
    for j, f in enumerate(my_list):
         if not e == f:
            m[i,j] = similar(e,f)
            s[i] += m[i,j]

s = numpy.array(s)
best = numpy.asarray(my_list)[s == numpy.max(s)]
l_b = list([best])
for b in best:
    tp = numpy.array(m[my_list.index(b)])
    l_b.append(numpy.asarray(my_list)[tp == numpy.max(tp)].tolist())
print set([x for y in l_b for x in y])
# set(['dat', 'bag', 'bat', 'bot', 'cat'])

我不确定这是否是您想要的:

l = ['hello','hallo','holla','helio','cat','cap','tap','dog','hallo','hello']

def most_common(lst):
    return max(set(lst), key=lst.count)


def match(s1, s2):
    ok = False
    for c1, c2 in zip(s1, s2):
        if c1 != c2:
            if ok:
                return False
            else:
                ok = True
    return ok


def best(lst):
  results=[]
  for n  in range(len(lst)):
    results.append(0)
    for i in range (len(lst)):
      if match(str(lst[n]),str(lst[i])):
        results[n] += 1
  index = results.index(max(results))
  return lst[index]

print (best(l)) 

我不知道你们为什么把猫排除在你们的作品之外,也许是对猫的种族歧视!撇开玩笑不谈,这个函数完全满足您的要求,但它也在返回列表中包含cat。我认为您忘记在输出中包含cat,如果没有,请向我们提供更多详细信息,以便我们能够提供帮助:

def wordsOfOneDiff(main_str, seq):
    "Find words in seq that differ from man_str by only one character"

    diff = 0
    res = []

    for name in my_list:
        for c in main_str:
            if c not in name:
                diff += 1
        if diff <= 1:
            res.append(name)
        diff = 0
    return res
定义筛选数据的规则:

def only_one_different(a, b):
    '''Counts the letters in a and b and returns True if there is only one different'''
    a = collections.Counter(a)
    b = collections.Counter(b)
    # c and d are needed in case len(a) != len(b)
    c = a - b
    d = b - a
    return sum(c.values()) == 1 or sum(d.values()) == 1

def only_one_different(a, b):
    '''Compare a and b in sequence and return True if only one is different'''
    count = sum(c != d for c,d in itertools.zip_longest(a, b))
    return count == 1

# a couple of helpers
first = operator.itemgetter(0)
second = operator.itemgetter(1)
def count(item):
    return len(second(item))
找到所有可能的边并根据您的条件进行筛选:筛选的边将是
('bag','bat')

按每个边中的第一个字对边进行分组,并确定重复的最多次数。分组边的示例是
('bot',[('bot','bat'),('bot','cot')])

如果存在连接,则过滤大部分边

most_repeats = (group for group in repeated if count(group) == most)
最后,收集每个单词及其重复部分

for word, group in most_repeats:
    g = [word]
    _, repeats = zip(*group)
    g.extend(repeats)
    print(g)
结果:

['bat', 'bag', 'bot', 'cat', 'dat']
['cat', 'bat', 'cot', 'cut', 'dat']
['cot', 'bot', 'cat', 'cow', 'cut']

不清楚你在问什么。为什么输出中没有“羊”?因此,可以将其视为构建一个图形,其中每个单词(节点)都链接到每个单词,每个单词只有一个字符不同-然后他想要最高阶的节点(大多数边)以及它的所有邻居。为什么不在输出列表中使用
cat
?您是在要求算法/过程还是实际代码?您只是在比较字符串中的字母还是相同序列中的字母?
tob
bat
不同吗?嘿!是的,对不起,我忘了把猫也包括在内。这几乎是我所需要的,但我也忘了指出字母的顺序很重要。这花了我一段时间,但我最终还是以你的代码为指导得到了它。
repeated = [(k, list(g)) for k, g in itertools.groupby(edges, first)]
most = max(count(thing) for thing in repeated)
most_repeats = (group for group in repeated if count(group) == most)
for word, group in most_repeats:
    g = [word]
    _, repeats = zip(*group)
    g.extend(repeats)
    print(g)
['bat', 'bag', 'bot', 'cat', 'dat']
['cat', 'bat', 'cot', 'cut', 'dat']
['cot', 'bot', 'cat', 'cow', 'cut']