如何解决合并两个列表或n个元素
我有两个长度相同的列表:
list_1 = [1,2,3,4,5,6]
list_2 = ['a','b','c','d','e','f']
我需要基于n合并这些列表,如下所示:
- 如果n = 1:
result = [1,'a',6,'f']
- 如果n = 2:
result = [1,'f']
- 如果n = 3:
result = [1,'f']
- 如果n = 4:
result = [1,'f']
,依此类推
是否有任何pythonic方法来实现这一目标? 到目前为止,我只知道列表理解中n = 1的情况:
result = [x for sublist in zip(list_1,list_2) for x in sublist]
我不知道如何动态地做到这一点。
解决方法
尝试使用清单理解和一个衬里的itertools(zip_longest
和chain.from_iterable
):
import itertools
def merge(l1,l2,n):
return [j for i in zip(itertools.zip_longest(*[iter(l1)]*n),itertools.zip_longest(*[iter(l2)]*n)) for j in itertools.chain.from_iterable(i) if j]
list_1 = [1,2,3,4,5,6]
list_2 = ["a","b","c","d","e","f"]
print(merge(list_1,list_2,2))
# [1,'a','b','c','d',6,'e','f']
print(merge(list_1,3))
# [1,4))
# [1,'f']
一些可能的参考:How does zip(*[iter(s)]*n) work in Python?
,使用生成器的替代答案:
list_1 = [1,6]
list_2 = ['a','f']
def merge(a,b,n):
a_index = 0
b_index = 0
while(a_index < len(a)):
for _ in range(n):
yield a[a_index]
a_index +=1
for _ in range(n):
yield b[b_index]
b_index += 1
result = [x for x in merge(list_1,1)]
assert result == [1,'f']
result = [x for x in merge(list_1,2)]
assert result == [1,3)]
assert result == [1,'f']
仅适用于大小相同且可能存在更多陷阱的列表。
编辑:只是为了好玩,这是一个不管理索引的版本。
def merge(a,n):
gen_a = (x for x in a)
gen_b = (x for x in b)
try:
while True:
for _ in range(n):
yield next(gen_a)
for _ in range(n):
yield next(gen_b)
except StopIteration:
pass
,
def main(order,iArr,sArr):
arr = []
for type in order:
if type == 'i':
arr.append(iArr[0])
iArr.remove(iArr[0])
else:
arr.append(sArr[0])
sArr.remove(sArr[0])
return arr
order1 = ['i','s','i','s']
order2 = ['i','s']
order3 = ['i','s']
list_1 = [1,'f']
print(main(order2,list_1,list_2))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。