列表理解做dupli

2024-10-03 17:27:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个正在运行的python脚本,可以读取电话号码文件。有些电话号码是无效的。你知道吗

import re

def IsValidNumber(number, pattern):
    isMatch = re.search(pattern, number)
    if isMatch is not None:
        return number

numbers = [line.strip() for line in open('..\\phoneNumbers.txt', 'r')]

然后我用另一个列表来过滤坏数字:

phonePattern = '^\d{10}$'
validPhoneNumbers = [IsValidNumber(x, phonePattern) for x in phoneNumbers 
    if IsValidNumber(x, phonePattern) is not None]
for x in validPhoneNumbers:
    print x

由于格式的原因,第二个列表跨越两行。你知道吗

问题是,尽管IsValidNumber只应在匹配有效时返回数字,但在无效匹配时也返回“None”。所以我不得不修改第二个列表:

if IsValidNumber(x, phonePattern) is not None

虽然这样做有效,但问题是对于列表中的每个迭代,函数都会执行两次。有没有更干净的方法?你知道吗


Tags: inrenonenumber列表forifis
3条回答

我将更改您的有效性检查方法,只返回数字是否匹配,而不返回数字本身。你知道吗

def is_valid_number(number):
    return re.search(r'^\d{10}$', number)

然后可以过滤掉第一个列表中的无效数字:

numbers = [line.strip() for line in open('..\\phoneNumbers.txt', 'r')
    if is_valid_number(line.strip())]

试试这个:

validPhoneNumbers = [x for x in phoneNumbers if isValidNumber(x, phonepattern)]

因为isValidNumber返回的数字与传入的数字相同,没有修改,所以实际上不需要这个数字。您只需要知道返回了一个数字(这意味着该数字是有效的)。你知道吗

您也可以将整个过程与以下内容结合起来:

validPhoneNumbers = [x.strip() for x in open('..\\phonenumbers.txt', 'r') if isValidNumber(x.strip(), phonePattern)]

你的isValidFunction应该返回True/False(顾名思义)。这样,您的列表理解就会变成:

valid = [num for num in phoneNumbers if isValidNumber(num, pattern)]

当您进行此操作时,请将numbers修改为生成器表达式,而不是列表理解(因为您对效率感兴趣):

numbers = (line.strip() for line in open("..\\phoneNumbers.txt"))

相关问题 更多 >