【问题标题】:Alternative for zip in python 3?python 3中zip的替代品?
【发布时间】:2019-06-17 09:47:00
【问题描述】:

python 3 中 zip 的替代方案?

from itertools import zip_longest 
list_1 = [["ele1"],["ele_2"],["ele_3"]]
list_2 = [["ele4"],["ele_5"]]

result = [[x for x in t if x is not None] for t in zip_longest(list_1,list_2)]
print(result)

我的输出为

[[['ele1'], ['ele4']], [['ele_2'], ['ele_5']], [['ele_3']]]

预期输出:

[['ele1'], ['ele4']], [['ele_2'], ['ele_5']], [['ele_3']]

【问题讨论】:

  • 预期输出是什么?
  • @yatu 我提到请看代码
  • 你的输出和预期的输出是一样的..
  • 但我想要 zip 的替代品
  • [['ele1'], ['ele4']], [['ele_2'], ['ele_5']], [['ele_3']] 是一个元组 ([['ele1'], ['ele4']], [['ele_2'], ['ele_5']], [['ele_3']]) 而不是一个列表

标签: python merge concat


【解决方案1】:

如果您想避免使用压缩两个列表,我会这样做的方法是将两个列表中的值附加到 try/except 子句中,并附加来自 list_2(或 list_1如果它是两者中最短的一个)定义为一个迭代器,避免在迭代时必须zip两个列表:

# iterate over the longest list. Define other as iterator
l2 = iter(list_2)
out = [[] for _ in range(len(list_1))]
for ix, i in enumerate(list_1): 
    try:
        out[ix].append(i)
        out[ix].append(next(l2))
    except StopIteration:
        break

给予:

print(out)
[[['ele1'], ['ele4']], [['ele_2'], ['ele_5']], [['ele_3']]]

【讨论】:

  • 是的,这个想法是迭代最长的 lsit @tobias_k ,也许应该更清楚。虽然避开zip_longest,但想不出其他办法
  • break 有一个额外的缩进
【解决方案2】:

您还可以将两个(或更多)列表收集到另一个列表中,并使用嵌套列表推导来模拟 zip_longest 的行为。

>>> lists = [list_1, list_2] # an also be more than two lists
>>> [[lst[i] for lst in lists if i < len(lst)]
...  for i in range(max(map(len, lists)))]
...
[[['ele1'], ['ele4']], [['ele_2'], ['ele_5']], [['ele_3']]]

(如果你在上面的表达式中将max 换成min,你会得到zip。)

如果要打印不带最外层[...]的结果:

>>> print(', '.join(map(str, _)))                                          
[['ele1'], ['ele4']], [['ele_2'], ['ele_5']], [['ele_3']]

【讨论】:

    猜你喜欢
    • 2013-04-14
    • 2012-02-18
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    相关资源
    最近更新 更多