Python 是否有更好的方法定义此生成器?
假设我想制作一个生成器,从列表中返回固定数量的用户,如果我想要的用户数量大于列表的长度,它只会重复最后一个用户。我在下面编写了一个生成器:Python 是否有更好的方法定义此生成器?,python,functional-programming,generator,Python,Functional Programming,Generator,假设我想制作一个生成器,从列表中返回固定数量的用户,如果我想要的用户数量大于列表的长度,它只会重复最后一个用户。我在下面编写了一个生成器: def gen_users(users, total): num_users = len(users) cur_user = 0 while cur_user < total: if cur_user >= num_users: yield users[-1] els
def gen_users(users, total):
num_users = len(users)
cur_user = 0
while cur_user < total:
if cur_user >= num_users:
yield users[-1]
else:
yield users[cur_user]
cur_user += 1
def gen_用户(用户总数):
num_users=len(用户)
cur_user=0
当前用户<总计:
如果cur\u user>=num\u用户:
产量用户[-1]
其他:
产生用户[当前用户]
cur_user+=1
因此,如果我有一个用户列表users=['one','two','three']
我调用gen_用户(users,5)
我会返回one,two,three,three
有没有更像蟒蛇的方法?使用发电机是解决此问题的有效方法吗?使用:
或者,您可以使用用户[:total]
,但它将创建临时序列
更新
略加修改的Hans Zauber代码版本:
>>> from itertools import islice, chain, repeat
>>>
>>> def gen_users(users, total):
... return islice(chain(users, repeat(users[-1])), total)
...
>>> list(gen_users([1,2,3], 5))
[1, 2, 3, 3, 3]
>>> list(gen_users([1,2,3], 3))
[1, 2, 3]
>>> list(gen_users([1,2,3], 2))
[1, 2]
使用:
或者,您可以使用用户[:total]
,但它将创建临时序列
更新
略加修改的Hans Zauber代码版本:
>>> from itertools import islice, chain, repeat
>>>
>>> def gen_users(users, total):
... return islice(chain(users, repeat(users[-1])), total)
...
>>> list(gen_users([1,2,3], 5))
[1, 2, 3, 3, 3]
>>> list(gen_users([1,2,3], 3))
[1, 2, 3]
>>> list(gen_users([1,2,3], 2))
[1, 2]
试试这一行:
import itertools
gen_users = lambda users, total: itertools.chain(itertools.islice(users, total), itertools.repeat(users[-1], total-len(users)))
试试这一行:
import itertools
gen_users = lambda users, total: itertools.chain(itertools.islice(users, total), itertools.repeat(users[-1], total-len(users)))
正是我想要的,我知道必须有更好的方法来做到这一点!谢谢。如果
total
很大,那么使用xrange
可能会有所改进。@HansZauber,我使用range
来确保这段代码在Python 2.x和3.x中都能运行。这正是我想要的,我知道必须有更好的方法来做到这一点!谢谢。如果total
很大,那么使用xrange
可能是一种改进。@HansZauber,我使用range
来确保这段代码在Python 2.x和3.x中都能运行。试试列表(gen_用户([1,2,3],2))
。修复了,我忘了这个问题。这个答案也很棒,同样有效。谢谢。请尝试列表(gen_用户([1,2,3],2))
。修复了,我忘了这个问题。这个答案也很棒,同样有效。谢谢