一个 Python 函数,它将任意数量的列表交错为参数



为了简单起见而编辑,因为我已将问题指向"参数解包"。
我正在尝试编写一个将任意数量的列表交错为参数的函数。所有列表的长度相等。该函数应返回一个列表,其中包含交错输入列表中的所有元素。

def interleave(*args):
for i, j, k in zip(*args):
print(f"On {i} it was {j} and the temperature was {k} degrees celsius.")
interleave(["Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split()],["rainy rainy sunny cloudy rainy sunny sunny".split()],[10,12,12,9,9,11,11])

输出:

On ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] it was ['rainy', 'rainy', 'sunny', 'cloudy', 'rainy', 'sunny', 'sunny'] and the temperature was 10 degrees celsius.

期望的输出:

On Monday it was rainy and the temperature was 10 degrees celsius.
On Tuesday it was rainy and the temperature was 12 degrees celsius.
On Wednesday it was sunny and the temperature was 12 degrees celsius.
On Thursday it was cloudy and the temperature was 9 degrees celsius.
On Friday it was rainy and the temperature was 9 degrees celsius.
On Saturday it was sunny and the temperature was 11 degrees celsius.
On Sunday it was sunny and the temperature was 11 degrees celsius.

不要将split的结果包装在列表中。 所以,改变

interleave(["Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split()],["rainy rainy sunny cloudy rainy sunny sunny".split()],[10,12,12,9,9,11,11])

interleave("Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(),"rainy rainy sunny cloudy rainy sunny sunny".split(),[10,12,12,9,9,11,11]).

前者将产生两个长度为 1 的列表和一个长度为 7 的列表作为参数interleave,后者/更改将导致三个长度为 7 的列表作为参数。 后者是zip操作员根据需要工作所需要的。

itertools文档的配方部分称此roundrobin

def roundrobin(*iterables):
"roundrobin('ABC', 'D', 'EF') --> A D E B F C"
# Recipe credited to George Sakkis
num_active = len(iterables)
nexts = cycle(iter(it).__next__ for it in iterables)
while num_active:
try:
for next in nexts:
yield next()
except StopIteration:
# Remove the iterator we just exhausted from the cycle.
num_active -= 1
nexts = cycle(islice(nexts, num_active))

特别是对于(大小相等的(列表,您可以将其简化为

def interleave(*args):
return list(chain.from_iterable(zip(*args)))

最新更新