在列表中查找递减的完整单词字符串的循环

0 投票
3 回答
753 浏览
提问于 2025-04-18 13:38

我有一个字符串变量,里面是一个人的名字和中间名,结果不小心把它们连在一起了。我们叫这个变量为 firstMiddle="johnadam"

我需要找出哪个是名字,哪个不是,然后把它们分开成不同的变量。我有一个很大的文本文件,里面全是名字,想法是检查这个完整的 firstMiddle 字符串是否在这个名字列表里,如果不在,就把它的长度减一,再试一次。(如果你增加长度就会失败,比如 "max""maxinea" 中提取不出来)

我试过一百种不同的方法,但我的问题似乎是我无法在某个范围内找到完整的单词(这个 \b 正则表达式的东西只对实际字符串有效,而不对字符串变量有效?)。我得到的最好结果是把 "johnadam" 减到 "johna",因为列表里有个名字 "johnathan"。现在我甚至记不起来我是怎么做到的,我现在的代码只减了一次就停止了,即使 nameToMatchnameList == False

我真的是个新手。我知道我在做一些非常明显的傻事。请帮帮我。这里有一些代码:

firstMiddle = "johnadam"
nameToCheck = firstMiddle

for match in nameList:
    if nameToCheck not in nameList:
        nameToCheck = nameToCheck[:-1]
        break

firstName = nameToCheck
middleName = firstMiddle.partition(nameToCheck)[2]

3 个回答

0

你可以用一种比较简单的方法来解决这个问题。

就是对混合的名字进行逐个检查,每次切割得更细一些。

这样你就能得到

['johnadam']
['johnada','m']
['johnad','am']
['johna','dam']

['john','adam'] # your names in the list

如果其中有一个匹配上了,就把它放到一边,继续这个过程,直到所有的名字都匹配上。

如果你有一些名字是相同开头的,比如'john'和'johnathan',或者是在其他名字中间的,比如'natham'和'johnathan',那么当你找到一个匹配时,不要停下来,而是继续切割,这样你就能得到['john','athan']和['joh','nathan']。

mixnames = ['johnadam','johnathan','johnamax']
names = ['john','adam', 'johnathan','nathan','max']

foundnames = []
for name in mixnames:
    for i in xrange(len(name)):
        name1 = name[0:i+1]
        name2 = name[i:]
        if name1 in names and name1 not in foundnames:
            foundnames.append(name1)
        if name2 in names and name2 not in foundnames:
            foundnames.append(name2)

print foundnames

输出结果:

['john', 'adam', 'johnathan', 'nathan', 'max']
0

这其实是对Gabriel所做的一个简单修改。基本的概念还是一样的。这个版本是看最长的匹配,而不是第一个匹配。因为整个代码放在评论区里太长了,所以我单独回答。

firstMiddle = "johnadam"
nameToCheck = firstMiddle
nameList = ['johnathan', 'john', 'kate', 'sam']

firstNames = filter(lambda m: firstMiddle.startswith(m), nameList)
middleName = ''
if firstNames: # if the list isnt empty
    firstName = sorted( firstNames, key=len )[-1]
    middleName = firstMiddle.partition(firstName)[2]
else: 
    firstName = firstMiddle


print firstName

看看这个是否有效……

2

这段代码的目的是为了实现某个功能。它可能包含了一些步骤或者方法,帮助我们完成特定的任务。具体来说,代码块里可能有一些变量、函数或者条件判断,这些都是编程中常用的元素。

如果你是编程小白,可以把这段代码想象成一个食谱。每一步都告诉你该做什么,最终的目标是做出一道美味的菜肴。在这个过程中,你需要按照顺序来执行每一步,才能得到想要的结果。

所以,理解这段代码的关键在于逐步分析每个部分,看看它们是如何协同工作的。这样,你就能更好地掌握它的功能和用途。

firstMiddle = "johnadam"
nameToCheck = firstMiddle
nameList = ['johnathan', 'john', 'kate', 'sam']

while nameToCheck not in nameList:
    nameToCheck = nameToCheck[:-1]
firstname = nameToCheck
middleName = firstMiddle[ len(firstName): ]

撰写回答