Python函数返回名字和姓氏中的常用字母列表

Posted

技术标签:

【中文标题】Python函数返回名字和姓氏中的常用字母列表【英文标题】:Python Function to return a list of common letters in first and last names 【发布时间】:2012-04-02 07:47:31 【问题描述】:

问题:不要在你的函数中使用集合:使用列表返回名字和姓氏中常见字母的列表(交集) 提示用户输入名字和姓氏并使用名字和姓氏调用函数作为参数并打印返回的列表。

即使有字母匹配,我也无法弄清楚为什么我的程序只是打印“无匹配”。什么都有帮助!非常感谢!

到目前为止的代码:

import string

def getCommonLetters(text1, text2):
""" Take two strings and return a list of letters common to
    both strings."""
    text1List = text1.split()
    text2List = text2.split()
    for i in range(0, len(text1List)):
        text1List[i] = getCleanText(text1List[i])
    for i in range(0, len(text2List)):
        text2List[i] = getCleanText(text2List[i])

    outList = []
    for letter in text1List:
        if letter in text2List and letter not in outList:
           outList.append(letter)
    return outList

def getCleanText(text):
"""Return letter in lower case stripped of whitespace and
punctuation characters"""
    text = text.lower()

    badCharacters = string.whitespace + string.punctuation
    for character in badCharacters:
        text = text.replace(character, "")
    return text

userText1  = raw_input("Enter your first name: ")
userText2  = raw_input("Enter your last name: ")
result     = getCommonLetters(userText1, userText2)
numMatches = len(result)
if numMatches == 0:
    print "No matches."
else:
    print "Number of matches:", numMatches

for letter in result:
    print letter

【问题讨论】:

问题似乎是你用Python语法写Java... 【参考方案1】:

试试这个:

def CommonLetters(s1, s2):
    l1=list(''.join(s1.split()))
    l2=list(''.join(s2.split()))
    return [x for x in l1 if x in l2]

print CommonLetters('Tom','Dom de Tommaso')    

输出:

>>> ['T', 'o', 'm']

【讨论】:

非常感谢!这简直救了我。我已经研究这个问题好几个小时了。 无需将字符串转换为列表。字符串已经是可迭代的。我什至会跳过拆分,因为这不会删除标点符号,因此您仍然需要单独的过滤步骤。只需def common_letters(s1, s2): return [x for x in s1 if x in s2] 就可以了。 @JBernardo No sets 在问题中指定。 解决方案根本行不通,而且是功课。你不给学生做作业,或者至少你给出了很好的解决方案。 @Vincent Savard:Mm 应该在 CommonLetters() 中匹配并不明显。如果是这样,使用s1.upper() 可以解决这个问题。【参考方案2】:
for letter in text1List:

这是你的问题。 text1List 是一个list,而不是一个string。您迭代一个字符串列表(例如 ['Bobby', 'Tables'])并检查 'Bobby' 是否在列表 text2List 中。

您想迭代字符串 text1 的每个字符并检查它是否存在于字符串 text2 中。

您的代码中有一些非 Python 习语,但您会及时了解的。

跟进:如果我用小写字母输入我的名字,用大写字母输入我的姓氏,会发生什么?您的代码会找到任何匹配项吗?

【讨论】:

【参考方案3】:

set() 成为 Python 2.5 中删除重复项的常用习语之前,您可以使用将列表转换为字典来删除重复项。

这是一个例子:

def CommonLetters(s1, s2):
    d=
    for l in s1:
        if l in s2 and l.isalpha():
            d[l]=d.get(l,0)+1
    return d                             

print CommonLetters('matteo', 'dom de tommaso')   

这会打印常见字母的计数,如下所示:

'a': 1, 'e': 1, 'm': 1, 't': 2, 'o': 1 

如果你想拥有这些常用字母的列表,只需使用字典的 keys() 方法:

print CommonLetters('matteo', 'dom de tommaso').keys()

只打印键:

['a', 'e', 'm', 't', 'o']

如果要匹配大小写字母,请在此行添加逻辑:

if l in s2 and l.isalpha():

【讨论】:

以上是关于Python函数返回名字和姓氏中的常用字母列表的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中使用 toupper 函数的问题

如何将电子邮件地址中名字和姓氏的第一个字母大写?

Python之函数式编程

python函数2(返回值传递列表...)

Python:将员工姓名与公司、年龄、性别匹配

Oracle中的SQL语句的题目,求解答啊