Какой хороший способ сделать показ в Python - PullRequest
37 голосов
/ 15 апреля 2010

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

Мои лучшие идеи:

sum(meets_condition(x) for x in my_list)

и

len([x for x in my_list if meets_condition(x)])

Первый, основанный на итераторах, предположительно быстрее для больших списков. И это та же форма, что вы использовали бы для тестирования любого и всех. Однако это зависит от того, что int (True) == 1, что несколько уродливо.

Мне кажется, что второе легче читать, но оно отличается от любой и всех форм.

У кого-нибудь есть предложения получше? есть ли где-нибудь библиотечная функция, которую мне не хватает?

Ответы [ 3 ]

49 голосов
/ 15 апреля 2010

Подход, основанный на итераторах, очень хорош. Есть несколько небольших изменений, которые могут подчеркнуть тот факт, что вы рассчитываете:

sum(1 if meets_condition(x) else 0 for x in my_list)
# or 
sum(1 for x in my_list if meets_condition(x))

И, как всегда, если намерение не очевидно из кода, заключите его в описательно названную функцию:

def count_matching(condition, seq):
    """Returns the amount of items in seq that return true from condition"""
    return sum(1 for item in seq if condition(item))

count_matching(meets_condition, my_list)
11 голосов
/ 15 апреля 2010

Первый

sum(meets_condition(x) for x in my_list)

выглядит отлично читаемым и питоническим для меня.

Если вы предпочитаете второй подход, я бы выбрал

len(filter(meets_condition, my_list))

Еще один способ может быть:

map(meets_condition, my_list).count(True)
1 голос
/ 24 октября 2014

указатель для списка

#counting if a number or string is in a list
my_list=[1,2,3,2,3,1,1,1,1,1, "dave" , "dave"]
one=sum(1 for item in my_list if item==(1))
two=sum(1 for item in my_list if item==(2))
three=sum(1 for item in my_list if item==(3))
dave=sum(1 for item in my_list if item==("dave"))
print("number of one's in my_list > " , one)
print("number of two's in my_list > " , two)
print("number of three's in my_list > " , three)
print("number of dave's in my_list > " , dave)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...