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