python:获取具有特定条件的列表(序列)中的项目数

时间:2013-03-13 00:51:19

标签: python list count functional-programming sequence

假设我有一个包含大量项目的列表。

l = [ 1, 4, 6, 30, 2, ... ]

我想从该列表中获取项目数,其中项目应满足特定条件。我的第一个想法是:

count = len([i for i in l if my_condition(l)])

但是如果my_condition()过滤的列表也有很多项,我想是的 为过滤结果创建新列表只是浪费内存。为了效率,恕我直言,以上呼叫不能比:

count = 0
for i in l:
    if my_condition(l):
        count += 1

在没有生成临时列表的情况下,是否有任何功能式方法可以获得满足特定条件的项目数?

提前致谢。

6 个答案:

答案 0 :(得分:83)

您可以使用generator expression

>>> l = [1, 3, 7, 2, 6, 8, 10]
>>> sum(1 for i in l if i % 4 == 3)
2

甚至

>>> sum(i % 4 == 3 for i in l)
2

使用int(True) == 1这一事实。

或者,您可以使用itertools.imap(python 2)或仅使用map(python 3):

>>> def my_condition(x):
...     return x % 4 == 3
... 
>>> sum(map(my_condition, l))
2

答案 1 :(得分:16)

你想要一个generator comprehension而不是一个列表。

例如,

l = [1, 4, 6, 7, 30, 2]

def my_condition(x):
    return x > 5 and x < 20

print sum(1 for x in l if my_condition(x))
# -> 2
print sum(1 for x in range(1000000) if my_condition(x))
# -> 14

或者使用itertools.imap(虽然我认为明确的列表和生成器表达式看起来更像Pythonic)。

请注意,虽然从sum示例中并不明显,但您可以很好地组合生成器理解。例如,

inputs = xrange(1000000)      # In Python 3 and above, use range instead of xrange
odds = (x for x in inputs if x % 2)  # Pick odd numbers
sq_inc = (x**2 + 1 for x in odds)    # Square and add one
print sum(x/2 for x in sq_inc)       # Actually evaluate each one
# -> 83333333333500000

这项技术很酷的一点是,您可以在代码中指定概念上独立的步骤,而不必在内存中强制进行评估和存储,直到评估最终结果。

答案 2 :(得分:6)

如果您更喜欢函数式编程,也可以使用reduce(lambda count, i: count + my_condition(i), l, 0) 来完成

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="ir.tehraninternet780.standupcomedy.Main3Activity"
android:paddingRight="@dimen/activity_vertical_margin">

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/imageView14"
    android:layout_alignParentTop="true"
    android:src="@drawable/selectmatchtext"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:paddingRight="10dp" />

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/scrollView"
    android:layout_below="@+id/imageView14"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true">
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true">
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="130dp"
            android:background="@drawable/multi_bg2"
            android:id="@+id/RelativeBtn1"
            android:layout_below="@+id/imageView14"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true">

            <ImageView
                android:layout_width="80dp"
                android:layout_height="80dp"
                android:id="@+id/imageView9"
                android:src="@drawable/masoodi"
                android:layout_marginLeft="18dp"
                android:layout_marginStart="18dp"
                android:layout_alignParentTop="true"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:layout_marginTop="10dp" />

            <ImageView
                android:layout_width="80dp"
                android:layout_height="80dp"
                android:id="@+id/imageView10"
                android:src="@drawable/logo780old"
                android:layout_alignParentTop="true"
                android:layout_alignParentRight="true"
                android:layout_alignParentEnd="true"
                android:layout_marginRight="18dp"
                android:layout_marginEnd="18dp"
                android:layout_marginTop="10dp" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="علی مسعودی"
                android:id="@+id/textView2"
                android:layout_below="@+id/imageView9"
                android:layout_alignLeft="@+id/imageView9"
                android:layout_alignStart="@+id/imageView9"
                android:layout_alignRight="@+id/imageView9"
                android:layout_alignEnd="@+id/imageView9"
                android:textAlignment="center"
                android:layout_marginTop="10dp"
                android:textColor="@color/White" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="شقایق دهقان"
                android:id="@+id/textView3"
                android:textAlignment="center"
                android:layout_alignTop="@+id/textView2"
                android:layout_alignLeft="@+id/imageView10"
                android:layout_alignStart="@+id/imageView10"
                android:layout_alignRight="@+id/imageView10"
                android:layout_alignEnd="@+id/imageView10"
                android:textColor="@color/White" />
        </RelativeLayout>

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="130dp"
            android:background="@drawable/multi_bg2"
            android:id="@+id/relativeLayout"
            android:layout_below="@+id/RelativeBtn1"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true">

            <ImageView
                android:layout_width="80dp"
                android:layout_height="80dp"
                android:id="@+id/imageView15"
                android:src="@drawable/masoodi"
                android:layout_marginLeft="18dp"
                android:layout_marginStart="18dp"
                android:layout_alignParentTop="true"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:layout_marginTop="10dp" />

            <ImageView
                android:layout_width="80dp"
                android:layout_height="80dp"
                android:id="@+id/imageView16"
                android:src="@drawable/dehghan"
                android:layout_alignParentTop="true"
                android:layout_alignParentRight="true"
                android:layout_alignParentEnd="true"
                android:layout_marginRight="18dp"
                android:layout_marginEnd="18dp"
                android:layout_marginTop="10dp" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="علی مسعودی"
                android:id="@+id/textView4"
                android:layout_below="@+id/imageView15"
                android:layout_alignLeft="@+id/imageView15"
                android:layout_alignStart="@+id/imageView15"
                android:layout_alignRight="@+id/imageView15"
                android:layout_alignEnd="@+id/imageView15"
                android:textAlignment="center"
                android:layout_marginTop="10dp"
                android:textColor="@color/White" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="شقایق دهقان"
                android:id="@+id/textView6"
                android:textAlignment="center"
                android:layout_alignTop="@+id/textView4"
                android:layout_alignLeft="@+id/imageView16"
                android:layout_alignStart="@+id/imageView16"
                android:layout_alignRight="@+id/imageView16"
                android:layout_alignEnd="@+id/imageView16"
                android:textColor="@color/White" />
        </RelativeLayout>

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="130dp"
            android:background="@drawable/multi_bg2"
            android:id="@+id/relativeLayout3"
            android:layout_below="@+id/relativeLayout"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true" >

            <ImageView
                android:layout_width="80dp"
                android:layout_height="80dp"
                android:id="@+id/imageView19"
                android:src="@drawable/masoodi"
                android:layout_marginLeft="18dp"
                android:layout_marginStart="18dp"
                android:layout_alignParentTop="true"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:layout_marginTop="10dp" />

            <ImageView
                android:layout_width="80dp"
                android:layout_height="80dp"
                android:id="@+id/imageView20"
                android:src="@drawable/dehghan"
                android:layout_alignParentTop="true"
                android:layout_alignParentRight="true"
                android:layout_alignParentEnd="true"
                android:layout_marginRight="18dp"
                android:layout_marginEnd="18dp"
                android:layout_marginTop="10dp" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="علی مسعودی"
                android:id="@+id/textView9"
                android:layout_below="@+id/imageView19"
                android:layout_alignLeft="@+id/imageView19"
                android:layout_alignStart="@+id/imageView19"
                android:layout_alignRight="@+id/imageView19"
                android:layout_alignEnd="@+id/imageView19"
                android:textAlignment="center"
                android:layout_marginTop="10dp"
                android:textColor="@color/White" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="شقایق دهقان"
                android:id="@+id/textView10"
                android:textAlignment="center"
                android:layout_alignTop="@+id/textView9"
                android:layout_alignLeft="@+id/imageView20"
                android:layout_alignStart="@+id/imageView20"
                android:layout_alignRight="@+id/imageView20"
                android:layout_alignEnd="@+id/imageView20"
                android:textColor="@color/White" />
        </RelativeLayout>

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="130dp"
            android:background="@drawable/multi_bg2"
            android:id="@+id/relativeLayout5"
            android:layout_below="@+id/relativeLayout"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true" >

            <ImageView
                android:layout_width="80dp"
                android:layout_height="80dp"
                android:id="@+id/imageView23"
                android:src="@drawable/masoodi"
                android:layout_marginLeft="18dp"
                android:layout_marginStart="18dp"
                android:layout_alignParentTop="true"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:layout_marginTop="10dp" />

            <ImageView
                android:layout_width="80dp"
                android:layout_height="80dp"
                android:id="@+id/imageView24"
                android:src="@drawable/dehghan"
                android:layout_alignParentTop="true"
                android:layout_alignParentRight="true"
                android:layout_alignParentEnd="true"
                android:layout_marginRight="18dp"
                android:layout_marginEnd="18dp"
                android:layout_marginTop="10dp" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="علی مسعودی"
                android:id="@+id/textView13"
                android:layout_below="@+id/imageView23"
                android:layout_alignLeft="@+id/imageView23"
                android:layout_alignStart="@+id/imageView23"
                android:layout_alignRight="@+id/imageView23"
                android:layout_alignEnd="@+id/imageView23"
                android:textAlignment="center"
                android:layout_marginTop="10dp"
                android:textColor="@color/White" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="شقایق دهقان"
                android:id="@+id/textView14"
                android:textAlignment="center"
                android:layout_alignTop="@+id/textView13"
                android:layout_alignLeft="@+id/imageView24"
                android:layout_alignStart="@+id/imageView24"
                android:layout_alignRight="@+id/imageView24"
                android:layout_alignEnd="@+id/imageView24"
                android:textColor="@color/White" />
        </RelativeLayout>

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="130dp"
            android:background="@drawable/multi_bg2"
            android:id="@+id/relativeLayout4"
            android:layout_below="@+id/relativeLayout"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true" >

            <ImageView
                android:layout_width="80dp"
                android:layout_height="80dp"
                android:id="@+id/imageView21"
                android:src="@drawable/masoodi"
                android:layout_marginLeft="18dp"
                android:layout_marginStart="18dp"
                android:layout_alignParentTop="true"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:layout_marginTop="10dp" />

            <ImageView
                android:layout_width="80dp"
                android:layout_height="80dp"
                android:id="@+id/imageView22"
                android:src="@drawable/dehghan"
                android:layout_alignParentTop="true"
                android:layout_alignParentRight="true"
                android:layout_alignParentEnd="true"
                android:layout_marginRight="18dp"
                android:layout_marginEnd="18dp"
                android:layout_marginTop="10dp" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="علی مسعودی"
                android:id="@+id/textView11"
                android:layout_below="@+id/imageView21"
                android:layout_alignLeft="@+id/imageView21"
                android:layout_alignStart="@+id/imageView21"
                android:layout_alignRight="@+id/imageView21"
                android:layout_alignEnd="@+id/imageView21"
                android:textAlignment="center"
                android:layout_marginTop="10dp"
                android:textColor="@color/White" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="شقایق دهقان"
                android:id="@+id/textView12"
                android:textAlignment="center"
                android:layout_alignTop="@+id/textView11"
                android:layout_alignLeft="@+id/imageView22"
                android:layout_alignStart="@+id/imageView22"
                android:layout_alignRight="@+id/imageView22"
                android:layout_alignEnd="@+id/imageView22"
                android:textColor="@color/White" />
        </RelativeLayout>

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="130dp"
            android:background="@drawable/multi_bg2"
            android:id="@+id/relativeLayout2"
            android:layout_below="@+id/relativeLayout"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true">

            <ImageView
                android:layout_width="80dp"
                android:layout_height="80dp"
                android:id="@+id/imageView17"
                android:src="@drawable/masoodi"
                android:layout_marginLeft="18dp"
                android:layout_marginStart="18dp"
                android:layout_alignParentTop="true"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:layout_marginTop="10dp" />

            <ImageView
                android:layout_width="80dp"
                android:layout_height="80dp"
                android:id="@+id/imageView18"
                android:src="@drawable/dehghan"
                android:layout_alignParentTop="true"
                android:layout_alignParentRight="true"
                android:layout_alignParentEnd="true"
                android:layout_marginRight="18dp"
                android:layout_marginEnd="18dp"
                android:layout_marginTop="10dp" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="علی مسعودی"
                android:id="@+id/textView7"
                android:layout_below="@+id/imageView17"
                android:layout_alignLeft="@+id/imageView17"
                android:layout_alignStart="@+id/imageView17"
                android:layout_alignRight="@+id/imageView17"
                android:layout_alignEnd="@+id/imageView17"
                android:textAlignment="center"
                android:layout_marginTop="10dp"
                android:textColor="@color/White" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="شقایق دهقان"
                android:id="@+id/textView8"
                android:textAlignment="center"
                android:layout_alignTop="@+id/textView7"
                android:layout_alignLeft="@+id/imageView18"
                android:layout_alignStart="@+id/imageView18"
                android:layout_alignRight="@+id/imageView18"
                android:layout_alignEnd="@+id/imageView18"
                android:textColor="@color/White" />

        </RelativeLayout>
    </LinearLayout>
</ScrollView>

这样您只能进行1次传递,并且不会生成任何中间列表。

答案 3 :(得分:5)

你可以做点什么:

l = [1,2,3,4,5,..]
count = sum(1 for i in l if my_condition(i))

只为满足条件的每个元素添加1。

答案 4 :(得分:1)

from itertools import imap
sum(imap(my_condition, l))

答案 5 :(得分:0)

我有类似的问题并使用生成器来解决它。

我也认为这个问题可以帮到你: List filtering: list comprehension vs. lambda + filter