如果列表中唯一的内容最多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实现第一个代码段?
答案 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做到这一点