在列表中查找递减的完整单词字符串的循环
我有一个字符串变量,里面是一个人的名字和中间名,结果不小心把它们连在一起了。我们叫这个变量为 firstMiddle="johnadam"
我需要找出哪个是名字,哪个不是,然后把它们分开成不同的变量。我有一个很大的文本文件,里面全是名字,想法是检查这个完整的 firstMiddle
字符串是否在这个名字列表里,如果不在,就把它的长度减一,再试一次。(如果你增加长度就会失败,比如 "max"
从 "maxinea"
中提取不出来)
我试过一百种不同的方法,但我的问题似乎是我无法在某个范围内找到完整的单词(这个 \b 正则表达式的东西只对实际字符串有效,而不对字符串变量有效?)。我得到的最好结果是把 "johnadam"
减到 "johna"
,因为列表里有个名字 "johnathan"
。现在我甚至记不起来我是怎么做到的,我现在的代码只减了一次就停止了,即使 nameToMatch
在 nameList == 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 个回答
你可以用一种比较简单的方法来解决这个问题。
就是对混合的名字进行逐个检查,每次切割得更细一些。
这样你就能得到
['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']
这其实是对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
看看这个是否有效……
这段代码的目的是为了实现某个功能。它可能包含了一些步骤或者方法,帮助我们完成特定的任务。具体来说,代码块里可能有一些变量、函数或者条件判断,这些都是编程中常用的元素。
如果你是编程小白,可以把这段代码想象成一个食谱。每一步都告诉你该做什么,最终的目标是做出一道美味的菜肴。在这个过程中,你需要按照顺序来执行每一步,才能得到想要的结果。
所以,理解这段代码的关键在于逐步分析每个部分,看看它们是如何协同工作的。这样,你就能更好地掌握它的功能和用途。
firstMiddle = "johnadam"
nameToCheck = firstMiddle
nameList = ['johnathan', 'john', 'kate', 'sam']
while nameToCheck not in nameList:
nameToCheck = nameToCheck[:-1]
firstname = nameToCheck
middleName = firstMiddle[ len(firstName): ]