ins*_*get 4 python variables function representation
[灵感来自这个问题 ]
假设我有两个列表:
list1 = ['tom', 'mary', 'frank', 'joe', 'john', 'barry']
list2 = [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
我希望将每个名字list1
与一个数字相匹配list2
.由于有四个数字list2
,我想将前四个名称中的每一个与相应的数字配对list2
,并将随机数分配给其余的名称list1
.
我知道我可以使用for enumerate
和for来解决这个问题random.choice
.实际上,我已经为原始问题提供了这样的解决方案.
我想知道,如果有可能做这样的事情:
for name, number in itertools.izip_longest(list1, list2, fillvalue=MAGIC):
print name, number
Run Code Online (Sandbox Code Playgroud)
最初,我想过使用这样的东西:
MAGIC = random.choice(list1)
Run Code Online (Sandbox Code Playgroud)
但是,random.choice(list1)
首先执行,然后将答案用作fillvalue
压缩操作.这没有吸引力,因为它没有为它拉链的每对值选择一个新的随机值.因此很明显,它itertools.izip_longest
需要它fillvalue
本身具有价值的东西,而它并不称之为.实际上,如果我要为它提供一个函数,它将产生一个由名称和可调用函数组成的对,它也是低调的.因此,lambda
功能不是可行的解决方案.
我如何创建一个在调用函数时调用某个函数的变量?如何itertools.izip_longest
使用fillvalue
变量?是__repr__
该变量的叫什么?如果是这样,我可以创建一个__repr__
调用其中的函数的类吗?
似乎这里最简单的方法是创建一个生成所有填充值永恒的生成器,然后通过生成list2中的值来链接它:
def inf_gen(f):
while True:
yield f()
Run Code Online (Sandbox Code Playgroud)
注意,inf_gen(f)
实际上相当于iter(f, None)
,因为f
永远不会返回.iter
有两个参数调用第一个参数,直到它返回第二个参数.
然后使用它:
>>> from itertools import izip, chain
>>> for name, number in izip(list1,chain(list2, iter(lambda: random.choice(list2), None))):
print name, number
tom 1
mary 2
frank 3
joe 4
john 1
barry 4
Run Code Online (Sandbox Code Playgroud)
您也可以使用itertools来完成此操作,而无需使用生成器理解来定义单独的函数itertools.count
:
>>> from itertools import izip, chain, count
>>> for name, number in izip(list1, chain(list2, (random.choice(list2) for _ in count()))):
print name, number
Run Code Online (Sandbox Code Playgroud)