在python中返回“for if in”语句

2021-10-17 13:33:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码行:

val = tuple(s for s in name_list if str(ngram) in s)

这将搜索一个列表“name\u list”,并打印列表中包含子字符串“ngram”的所有元素。 Python似乎拥有这种强大的if-in魔法,而且非常紧凑。你知道吗

我习惯于把循环和条件句看作:

for line in file:

以及

if x == y:

那么有人能解释一下这些单行程序的实际结构吗。你知道吗

我之所以问这个问题是因为在我的特殊情况下,“name\u list”是一个包含60K+个元素的列表。一旦找到10个子字符串,我就想返回并从函数中得到一些结果。更具体地说:

s
for s in name_list:
    if str(ngram) in s:
        if len(s) <= 10:
             return true

前面的变量s是单独存在的,它使我不知道如何引用它,在我的例子中,如果s只是一个子串匹配。或者一个列表,它附加了每个找到的子字符串,然后我转换成一个元组。你知道吗

我需要一些心理上的帮助。你知道吗

2条回答
网友
1楼 ·

列出理解。

我建议读the list comprehensions section in the official Python documentation。你知道吗

下面是一些列表理解的例子。可以在列表理解中使用嵌套循环和条件。你知道吗

下面的列表理解通过在1-10范围内迭代来构建一个列表[2, 4, 6, 8, 10];在每次迭代中产生的整数被2整除。你知道吗

[n for n in range(1, 11) if n % 2 == 0]

也可以使用嵌套循环,并根据条件使用另一个值来补充元素。你知道吗

不管是谁,这个:

val = tuple(s for s in name_list if str(ngram) in s)

基本上是这样的(为了简单起见使用列表):

val = []

for s in name_list:

    if str(ngram) in s:
        val.append(s)
网友
2楼 ·

要剪切任意iterable(包括生成器),请使用函数^{}

gen = (s for s in name_list if str(ngram) in s)  # this is a generator
val = tuple(itertools.islice(gen, 10)) # take only 10 first elements

有关生成器表达式in this question的详细信息。你知道吗

为了解决您对阅读整个序列的担忧,以下是一个示例:

def gen():
    for x in xrange(1000000): # a lot
        print 'Yielding', x # to demo the side effect
        yield x

然后list(itertools.islice(gen(), 3))将返回[0, 1, 2]打印:

Yielding 1
Yielding 2
Yielding 3

然后发电机就会停止,因为没有人要求它继续。这就是所谓的lazy evaluation(顺便说一句,本文使用islice和其他itertools的例子来解释它)。你知道吗

相关问题