循环查找列表中递减的整个单词串

时间:2014-07-17 02:16:56

标签: python

我有一个字符串变量,它是一个人的第一个和中间名,它们被意外连接起来。我们称之为firstMiddle="johnadam"

我需要确定名字和名字是什么,然后将它们分成不同的变量。所以我有这个带有名字的大文本文件,我的想法是你检查完整的firstMiddle字符串以查看它是否在列表中,如果不是,那么你减少一个字符然后重试。 (如果你增加失败,例如来自"max"的{​​{1}})

我试过写了一百种不同的方法,而我的问题似乎是我无法用一整个词来表达x(这个\ b正则表达式的东西只适用于实际字符串而不是字符串变量?)。我将"maxinea"减少到"johnadam"的最佳结果是因为列表中有一个名称"johna"。现在我甚至不记得我是如何做到这一点的,我的当前代码只减少了一次,然后在"johnathan"中退出nameToMatch

我是一个总菜鸟。我知道我做的事情显然很愚蠢。请帮忙。这是一些代码:

nameList == False

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

这是加布里埃尔所做的一个简单的改变。这个概念基本相同。这只是看最长的比赛,而不是第一场比赛。很难将整个代码放在评论部分,以便单独回答。

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 :(得分:0)

你可以用蛮力的方式做到这一点。

迭代混合名称并每次更新它。

所以你得到了

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

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

如果其中一个匹配你就把它们放在一边并继续这样做,直到它们都匹配为止。

如果你的名字开头相同,那么约翰'和' johnathan'或者是其他名字的中间名,比如“natham'和' johnathan'你不应该在找到匹配时停下来,但继续做切片,所以你得到[' john ',' athan']和[&# 39; 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']