[灵感来自this question ]
假设我有两个列表:
list1 = ['tom', 'mary', 'frank', 'joe', 'john', 'barry']
list2 = [1, 2, 3, 4]
我想匹配 list1
中的每个名字编号在 list2
中.由于 list2
中有四个数字, 我想将前四个名字中的每一个与 list2
中的相应数字配对, 并将随机数分配给 list1
中的剩余名称.
我知道我可以使用带 enumerate
的 for 循环来解决这个问题和 random.choice
.事实上,我已经提供了 such a solution到原来的问题。
但是,我想知道是否可以这样做:
for name, number in itertools.izip_longest(list1, list2, fillvalue=MAGIC):
print name, number
最初,我想用这样的东西:
MAGIC = random.choice(list1)
但是,执行 random.choice(list1)
首先,然后使用答案作为 fillvalue
用于压缩操作。这是没有吸引力的,因为它不会为它压缩的每对值选择一个新的随机值。因此很明显,itertools.izip_longest
需要它的 fillvalue
,它本身具有值(value)的东西,它不会调用。事实上,如果我要为它提供一个函数,它会产生一对由一个名称和一个可调用函数组成的函数,这也是 undersired。为此,lambda
函数不是可行的解决方案。
我将如何着手创建一个在被调用时调用某个函数的变量? itertools.izip_longest
如何使用 fillvalue
多变的?是 __repr__
那个变量叫什么?如果是这样,我可以用 __repr__
上课吗?在里面调用一个函数?
最佳答案
似乎这里最简单的方法是创建一个生成器,它永久生成所有填充值,然后将其与生成列表 2 中的值链接起来:
def inf_gen(f):
while True:
yield f()
请注意,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
您也可以只使用 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
关于python - 类函数变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21614236/