我怎么能在这段代码中使用map()?

时间:2014-12-07 01:33:27

标签: python

我有一个字符串列表

[str1, str2, str3.....]

我还有一个def来检查字符串的格式,例如:

def CheckIP(strN):
    if(formatCorrect(strN)):
        return True
    return False

现在我想检查列表中的每个字符串,当然我可以用来逐个检查。但我可以使用map()来使代码更具可读性吗?

3 个答案:

答案 0 :(得分:6)

您可以将列表映射到您的函数,然后使用all检查每个项目是否返回True

if all(map(CheckIP, list_of_strings)):
    # All strings are good

实际上,删除CheckIP函数并直接使用formatCorrect会更清晰:

if all(map(formatCorrect, list_of_strings)):
    # All strings are good

此外,作为额外奖励,all使用延迟评估。这意味着,它只会在返回结果之前检查所需数量的项目。


但请注意,更常见的方法是使用generator expression代替map

if all(formatCorrect(x) for x in list_of_strings):

在我看来,生成器表达总是比map更好,因为:

  1. 它们的可读性稍高。

  2. 如果不比使用map更快,它们也同样快。此外,在Python 2.x中,map创建了一个通常不必要的列表对象(浪费内存)。仅在Python 3.x中,map使用惰性计算,如生成器表达式。

  3. 他们更强大。除了将项目映射到函数之外,生成器表达式还允许您在生成每个项目时对其执行操作。例如:

    sum(x * 2 for x in (1, 2, 3))
    
  4. 大多数Python程序员都喜欢它们。在编程时保持常规非常重要,因为它可以简化维护并使您的代码更易于理解。

  5. 有人谈到从该语言的未来版本中删除mapfilter等功能。虽然这不是一成不变的,但它在Python社区已经多次出现过。

  6. 当然,如果你是函数式编程的粉丝,那么你很可能同意第一和第四点。 :)

答案 1 :(得分:1)

一个例子,你怎么做:

in_str = ['str1', 'str2', 'str3', 'not']
in_str2 = ['str1', 'str2', 'str3']


def CheckIP(strN):
    # different than yours, just to show example.
    if 'str' in strN:       
        return True
    else:
        return False

print(all(map(CheckIP, in_str)))   # gives false
print(all(map(CheckIP, in_str2)))  # gives true 

答案 2 :(得分:1)

L = [str1, str2, str3.....]
answer = list(map(CheckIP, L)) 

answer是一个布尔值列表,answer[i]CheckIP(L[i])。如果您想进一步检查所有这些值是否为True,可以使用all

all(answer)

当且仅当True中的所有值均为answer时,才会返回True。但是,你可以这样做而不会发泄:

all(map(CheckIP, L)), as, in python3, `map` returns an iterator, not a list. This way, you don't waste space turning everything into a list. You also save on time, as the first `False` value makes `all` return `False`, stopping `map` from computing any remaining values