python中的压缩列表

2024-10-06 16:27:35 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有两个列表:

["aa", "bb", "cc"], ["dd", "ee", "ffg"]

我必须得到这样的输出:

["aadd", "bbee", "ccffg"]

我想到了拉链,但我觉得它比这先进一点,所以我真的不知道该怎么办。你知道吗


Tags: 列表ddeeaacc拉链bbaadd
3条回答

所以本质上你有两个列表,你需要在相同索引位置的两个元素之间执行相同的操作(连接)。你知道吗

map函数可以从列表中获取元素并执行所需的函数

list_a = ["aa", "bb", "cc"]
list_b = ["dd", "ee", "ffg"]

result = map(lambda x,y: x + y, list_a, list_b)

只是把这个map版本扔进去。列表理解更像是python,但这里有一个替代方法。你知道吗

>>> list1 = ["aa", "bb", "cc"]
>>> list2 = ["dd", "ee", "ffg"]
>>> map("".join, zip(list1, list2))
['aadd', 'bbee', 'ccffg']

你甚至可以用这个来创建一个生成器。你知道吗

>>> from itertools import izip, imap
>>> final = imap("".join, izip(list1, list2))
>>> next(final)
'aadd'
>>> next(final)
'bbee'

下面是三种不同解决方案的一些计时结果。(发电机一号打败了所有人)

>>> timeit('[a+b for a, b in zip(list1, list2)]', 'list1 = ["aa", "bb", "cc"]*100; list2 = ["dd", "ee", "ffg"]*100', number=10000)
0.4470004917966719
>>> timeit('map("".join, zip(list1, list2))', 'list1 = ["aa", "bb", "cc"]*100; list2 = ["dd", "ee", "ffg"]*100', number=10000)
0.43502864982517053
>>> timeit('imap("".join, izip(list1, list2))', 'from itertools import imap, izip; list1 = ["aa", "bb", "cc"]*100; list2 = ["dd", "ee", "ffg"]*100', number=10000)
0.011020268755800089
>>> timeit('[a+b for a, b in izip(list1, list2)]', 'from itertools import izip; list1 = ["aa", "bb", "cc"]*100; list2 = ["dd", "ee", "ffg"]*100', number=10000)
0.32172862839627214
>>> timeit('map(lambda x,y: x + y, list1, list2)', 'list1 = ["aa", "bb", "cc"]*100; list2 = ["dd", "ee", "ffg"]*100', number=10000)
0.5423113458890612

它比zip()稍微复杂一点,但仅仅是。只需在压缩后将项目对添加到一起:

>>> [a+b for a, b in zip(list1, list2)]
['aadd', 'bbee', 'ccffg']

其中list1list2是您的列表。你知道吗

这是因为zip()返回一个由一系列元组组成的对象,这些元组包含两个iterable中相应的元素。因此,为了连接这些项目,我们每次只需将它们添加到一起,创建一个新列表。你知道吗

相关问题 更多 >