2014-12-07 7 views
1

У меня есть список строкКак я могу использовать map() в этом коде?

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

и у меня также есть def проверить формат строк, что-то вроде:

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

Теперь я хочу, чтобы проверить каждую строку в списке, и в Конечно, я могу использовать для проверки по одному. Но могу ли я использовать map(), чтобы сделать код более читаемым ...?

+0

также быстрое примечание - в вашей 'функции CheckIP', вы на самом деле не нужны' if' заявление, так как вы только возвращение '' true' если formatCorrect 'is True и' False ', если это ложь. Так что вы можете просто сделать return formatCorrect (strN) ' –

+0

В зависимости от задачи подумайте об использовании' filter() ' – tynn

+0

Спасибо Г. Мейеру, хорошее предложение! – liuzhidong

ответ

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. Существует разговоры об удалении таких функций, как map, filter и т. Д. Из будущей версии языка. Хотя это не задано в камне, оно появилось много раз в сообществе Python.

Конечно, если вы являетесь поклонником функционального программирования, вы не будете иметь шансов, что вы согласитесь на баллы один и четыре.:)

+0

Что лучше и почему? –

+0

Я думаю, что вы уже говорили об этом, но, чтобы быть более подробным, '' все 'идет только до тех пор, пока он не найдет значение' False', поэтому, если один из первых является плохим, ему потребуется только повторить пару раз прежде чем найти его и займет гораздо меньше времени. –

+0

@ G.Meyer - Вы правы, я должен был быть более ясен. Это очень важный момент использования 'all'. Обновлено. – iCodez

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 
1
L = [str1, str2, str3.....] 
answer = list(map(CheckIP, L)) 

answer список булевы таким образом, что answer[i] является CheckIP(L[i]). Если вы хотите дополнительно проверить, если все эти значения Правда, вы могли бы использовать all:

all(answer) 

Это возвращает True тогда и только тогда, когда все значения в answer являются True. Тем не менее, вы можете сделать это без listifying:

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 
Смежные вопросы