带有生成器的Python listcomp

时间:2019-02-20 15:46:40

标签: python list-comprehension

如果列表中唯一的内容最多10次,我想将生成器生成的单词添加到列表中。

word_list = []
for i in range(10):
    next_word = next(test)
    if next_word not in word_list:
        word_list.append(next_word)

这是我为理解列表所做的尝试

word_list = [next(test) for next(test) in range(10) if next(test) not in word_list]

我遇到了两个问题

  • 我无法检查单词是否已经在listcomp内的列表中
  • 每次使用next(test)时,它都会重新生成一次,因此我无法添加下一个生成器

如何使用listcomp实现第一个代码段?

3 个答案:

答案 0 :(得分:1)

首先,让我们解决生成器问题。正如您提到的,您只希望在每个迭代中仅使用一次next(test)。最简单的解决方案是循环测试,就像调用next:

word_list = [s for _, s in zip(range(10), test)]

此代码将从生成器中获取前10个字。现在,您希望它仅采用唯一值。如果您不介意顺序,则可以将其转换为set而不是在list comp中进行检查:

word_list = set([s for _, s in zip(range(10), test)])

如果您介意订购,则可以使用OrderSet recipe,甚至可以更简单地使用OrderedDict:

from collections import OrderedDict    
word_list = [t[0] for t in OrderedDict({s:_ for _, s in zip(range(10), test)})]

然后您将得到与for循环相同的输出。 这种解决方案不是很容易理解,我必须说我宁愿使用旧的nice for循环。

或更像@tobias_k建议的那样:

from collections import OrderedDict
from itertools import islice
word_list = list(OrderedDict({s:s for s in islice(test, 0, 10)}))

答案 1 :(得分:0)

可能有点猜测,但我认为您真的想从生成器中提取下10个唯一值,在这种情况下,使用列表理解可能会很棘手,甚至您的带有循环的示例也无法做到这一点。要获取10个下一个唯一值:

 def gen():
     for n in [1,2,3,4,5,5,5,5,5,5,5,5,6,7,8,9,10,11,12]:
         yield n

 l = []
 g = gen()
 while len(l) < 11:
     try:
         v = next(g)
     except StopIteration:
         break
     if v not in l:
         l.append(v)
 print l

答案 2 :(得分:0)

您可以使用不需要range()函数的生成器:

$wp_hasher = new PasswordHash(16, true);   // 16 digit hashing password
$pass = $wp_hasher->HashPassword( trim( $posted['password'] ) ); //$posted['password'] is your password
echo $pass;

或者如果您需要调用n个项目,请使用itertools:

word_list = [item for item in test if item not in word_list]

或者您可以使用zip func:

import itertools

word_list = [item for item in itertools.islice(test,10) if item not in word_list]

或者如果您想获得前n个唯一项,我想您不能使用listcomp做到这一点