交替合并两个列表

Combine two lists alternatively

提问人:Mainland 提问时间:10/14/2023 最后编辑:Mark AdlerMainland 更新时间:10/16/2023 访问量:142

问:

我正在做一个简单的列表理解:以替代顺序组合两个列表并制作另一个列表。

big_list = [i,j for i,j in zip(['2022-01-01','2022-02-01'],['2022-01-31','2022-02-28'])]

预期输出:

['2022-01-01','2022-01-31','2022-02-01','2022-02-28']

当前输出:

Cell In[35], line 1
    [i,j for i,j in zip(['2022-01-01','2022-02-01'],['2022-01-31','2022-02-28'])]
     ^
SyntaxError: did you forget parentheses around the comprehension target?
python-3.x 列表 列表推导式 python-zip的

评论

0赞 tdelaney 10/14/2023
不是完整的答案,而是按照错误消息的建议去做:摆脱语法错误。big_list = [(i,j) for i,j in zip(['2022-01-01','2022-02-01'],['2022-01-31','2022-02-28'])

答:

6赞 Samwise 10/14/2023 #1

执行嵌套推导式操作,将项目从压缩的元组中拉出:

big_list = [
    i
    for t in zip(
        ['2022-01-01','2022-02-01'],
        ['2022-01-31','2022-02-28']
    )
    for i in t
]
3赞 Goku - stands with Palestine 10/14/2023 #2

您可以从 zip 中取消嵌套:

big_list = [
item 
for s in 
zip(['2022-01-01','2022-02-01'],['2022-01-31','2022-02-28']) 
for item in s]

#output

['2022-01-01', '2022-01-31', '2022-02-01', '2022-02-28']

一种方法是使用 itertools:

import itertools
big_list = list(itertools.chain(*zip(['2022-01-01','2022-02-01'],['2022-01-31','2022-02-28'])))

#output

['2022-01-01', '2022-01-31', '2022-02-01', '2022-02-28']

编辑:

这将非常缓慢:

sum([list(x) for x in zip(['2022-01-01','2022-02-01'],['2022-01-31','2022-02-28'])],[])

#output

['2022-01-01', '2022-01-31', '2022-02-01', '2022-02-28']
2赞 cards 10/14/2023 #3

A -free comprehension:交替追加。zip

l1 = ['2022-01-01','2022-02-01']
l2 = ['2022-01-31','2022-02-28']

l = [l1[i//2] if not i % 2 else l2[(i)//2] for i in range(min(len(l1), len(l2))*2)]

用于确保大小相等的列表(就像这样做一样)。minzip


一种自由的功能方法。如果列表大小不同,则应用类似“政治”的列表。zipzip

from itertools import chain
# l1, l2 from above

l = list(chain.from_iterable(map(lambda x, y: (x, y), l1, l2)))
2赞 Swifty 10/14/2023 #4

只是为了它,因为我实际上也会使用:zip

list1 = ['2022-01-01','2022-02-01']
list2 = ['2022-01-31','2022-02-28']
big_list = [(list1, list2)[i%2][i//2] for i in range(2 * min(len(list1), len(list2)))]

另一个版本,用于在两个列表的 2 个迭代器之间切换:itertools.cycle

from itertools import cycle
big_list = [next(next(cy)) for cy in [cycle((iter(list1), iter(list2)))] for _ in range(2 * min(len(list1), len(list2)))]
1赞 XMehdi01 10/16/2023 #5

我的代码使用函数将 L1 和 L2 中的相应元素配对,并使用循环将每个元素与其对组合在一起zipfor

l1 = ["2022-01-01", "2022-02-01"]
l2 = ["2022-01-31", "2022-02-28"]
zipped_lists = zip(l1, l2)
l3 = []
for list in zipped_lists:
    for date in list:
        l3.append(date)
print(l3)
# l3 = ['2022-01-01', '2022-01-31', '2022-02-01', '2022-02-28']