gpt4 book ai didi

python - 在python中混合两个不对称列表

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:41:44 25 4
gpt4 key购买 nike

>>> import itertools
>>> a = ['1', '2', '3', '4', '5']
>>> b = ['a', 'b', 'c', 'd', 'e', 'f']
>>> list(itertools.chain.from_iterable(zip(a,b)))
['1', 'a', '2', 'b', '3', 'c', '4', 'd', '5', 'e']

如您所见,我有两个不对称列表,我想像上面那样混合它们。问题是它忽略了最后一项。

预期:['1', 'a', '2', 'b', '3', 'c', '4', 'd', '5', 'e', 'f']

实际:['1', 'a', '2', 'b', '3', 'c', '4', 'd', '5', 'e']

最佳答案

因为您首先使用的是 itertools,我假设您希望它适用于任何可迭代对象,而不仅仅是列表,并且理想情况下不要先急切地列出它们。否则,就这样做:

list(itertools.chain.from_iterable(zip(a,b))) + a[len(b):] + b[len(a):]

zip_longest almost 函数开箱即用,但它会在较短的迭代用完后为每个插槽插入一个 fillvalue(默认 None) .如果您的值都是真实的,您可以使用 if i 过滤掉这些值,如 Ajax1234's answer ,或以 None 作为谓词的 filter,但是如果您的值可以是 Python 中的任何值,甚至是 None,那么唯一的方法就是获取相当笨重:

_sentinel = object()
[elem for elem in itertools.chain.from_iterable(itertools.zip_longest(a, b, fillvalue=_sentinel))
if elem is not _sentinel]

但是你可以看看 zip_longest 是如何工作的,然后自己做同样的事情,只生成“不完整”的元组而不是“填充的”元组,然后这样调用它:

list(itertools.chain.from_iterable(zip_longest_nofill(a, b)))

虽然从文档中制作一个很容易在 SO 答案中解释的 zip_longest 代码的变体有点具有挑战性,所以也许最好使用显式循环:

def zip_longest_nofill(*args):
empty = object()
its = [iter(arg) for arg in args]
while True:
vals = (next(it, empty) for it in its)
tup = tuple(val for val in vals if val is not empty)
if not tup:
return
yield tup

我觉得这个版本更容易理解(虽然实际上写起来有点难......)

当然,如果您要使用 zip_longest_nofill 的唯一目的是实现您的 flattened_zip_nofill,那么将其内联到展平部分会更容易,在这一点上,你基本上得到了最后一节中的两行代码。

关于python - 在python中混合两个不对称列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49483336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com