假设我有一个包含大量项目的列表。
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
在没有生成临时列表的情况下,是否有任何功能式方法可以获得满足特定条件的项目数?
提前致谢。
答案 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