gpt4 book ai didi

python - 合并两个带有标签的列表

转载 作者:行者123 更新时间:2023-11-28 20:45:27 24 4
gpt4 key购买 nike

我想将两个排序列表合并到一个新的排序列表中,但我想将标签包含到新列表中以查看哪个列表是每个值的来源。

到目前为止,这是我的代码:

l1 = [1, 40, 90, 104]
l2 = [5, 20, 70, 85, 230]
test = [(i, "l1") for i in l1 ] + [(i, "l2") for i in l2]
test.sort()
print test

[(1, 'l1'), (5, 'l2'), (20, 'l2'), (40, 'l1'), (70, 'l2'), (85, 'l2'), (90, 'l1'), (104, 'l1'), (230, 'l2')]

我使用的是 Python 2.7.6。有没有更快的方法来做到这一点?因为我的列表会很长(几十万)

最佳答案

l1 = [1, 40, 90, 104]
l2 = [5, 20, 70, 85, 230]

你可以选择你的标签方式:

ll1 = [(i, "l1") for i in l1]
ll2 = [(i, "l2") for i in l2]

import itertools
ll1i = zip(l1,itertools.repeat('l1'))
ll2i = zip(l2,itertools.repeat('l2'))

然后你要么把它整理出来:

test = sorted(ll1 + ll2)

或者你可以使用heapq.merge:

import heapq
test = list(heapq.merge(ll1, ll2))

或者使用带有 heapq 的生成器:

ll1g = ((i, "l1") for i in l1)
ll2g = ((i, "l2") for i in l2)
test = list(heapq.merge(ll1g, ll2g))

N.B.:通常,使用列表理解或生成器在 python 中具有更好的性能比使用 itertools。默认的 sort 算法通常表现得很好,但如果列表已经排序,heapq.merge 可能效果最好。

使用 timeit在 2.5GHz Core2Quad 上使用 Python3,这里是基准测试(函数重复 1000000 次):

使用 itertools:

>>> timeit.Timer(lambda: heapq.merge(ll1i, ll2i)).repeat()
[0.4750211238861084, 0.4694850444793701, 0.46796107292175293]
>>> timeit.Timer(lambda: sorted(list(ll1i)+list(ll2i))).repeat()
[1.9459788799285889, 1.9470620155334473, 1.9455249309539795]

使用列表:

>>> timeit.Timer(lambda: sorted(ll1+ll2)).repeat()
[2.1228671073913574, 2.125030994415283, 2.1156458854675293]
>>> timeit.Timer(lambda: list(heapq.merge(ll1,ll2)) ).repeat()
[9.534330129623413, 9.518659830093384, 9.540029048919678]

使用生成器:

>>> timeit.Timer(lambda: sorted(itertools.chain(ll1g, ll2g))).repeat()
[1.2377429008483887, 1.2369508743286133, 1.2312331199645996]
>>> timeit.Timer(lambda: list(heapq.merge(ll1g,ll2g)) ).repeat()
[3.9007039070129395, 3.9058940410614014, 3.9031548500061035]

做你自己的基准测试,并选择最适合你的环境的解决方案!

*编辑为包括结尾')'

关于python - 合并两个带有标签的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23530340/

24 4 0