一个 Python 函数,将任意数量的列表交错作为参数
A Python function that interleaves arbitrary number of lists as parameters
为了简单起见进行了编辑,因为我已将问题指向 'argument unpacking'。
我正在尝试编写一个将任意数量的列表交错作为参数的函数。所有列表的长度都相等。该函数应该 return 一个列表,其中包含交错的输入列表中的所有元素。
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.
itertools
文档的 recipe section 调用此 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)))
不要将 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
的参数,但 latter/change 将产生三个长度为 7 的列表作为参数。后者是 zip
运算符按照您的意愿工作所需要的。
为了简单起见进行了编辑,因为我已将问题指向 'argument unpacking'。
我正在尝试编写一个将任意数量的列表交错作为参数的函数。所有列表的长度都相等。该函数应该 return 一个列表,其中包含交错的输入列表中的所有元素。
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.
itertools
文档的 recipe section 调用此 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)))
不要将 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
的参数,但 latter/change 将产生三个长度为 7 的列表作为参数。后者是 zip
运算符按照您的意愿工作所需要的。