gpt4 book ai didi

sorting - 如何在 python 中使用排序输出进行 izip 压缩?

转载 作者:太空宇宙 更新时间:2023-11-04 07:11:03 25 4
gpt4 key购买 nike

由于没有更好的名字,我想用 Python 做一个“izip_sorted”。该函数的输入是许多可迭代对象,每个迭代对象都已排序。输出是一个带有排序输出的可迭代对象。

print([x for x in izip_sorted([0,4,8], [1,3,5], [12,12,42],[])])

编辑:这是一个简单的例子。真正的使用是在大约 40 个输入迭代器上,每个迭代器有大约 100000 个元素。每个元素都是一个类,存储一个字典并实现 __cmp__ 以便可以对元素进行排序。数据太大,一次读不完。

应该打印

[0, 1, 3, 4, 5, 8, 12, 12, 42]

我有一个解决方案,但我是 python 的新手,我不知道它是否非常 Pythonic。这可以改进吗?只改变 1 个元素的排序看起来很浪费......

def izip_sorted(*iterables):
"""
Return an iterator that outputs the values from the iterables, in sort order
izip_sort('ABF', 'D', 'CE') --> A B C D E F
"""
iterators = [iter(it) for it in iterables]
current_iterators = []
for it in iterators:
try:
current_iterators.append((next(it), it))
except StopIteration:
pass
current_iterators.sort(key=lambda x: x[0])
while(current_iterators):
yield current_iterators[0][0]
try:
current_iterators[0] = (next(current_iterators[0][1]), current_iterators[0][1])
current_iterators.sort(key=lambda x: x[0])
except StopIteration:
current_iterators = current_iterators[1:]

最佳答案

如果输入没有排序,那么它们必须全部实现(本质上,从可迭代对象变成列表)。不看数据就无法排序。 LattyWare's solution是最pythonic的。

如果另一方面,已知输入可迭代对象已排序,则可以使用 heapq.merge :

>>> from heapq import merge
>>> merge(*iterables)

关于sorting - 如何在 python 中使用排序输出进行 izip 压缩?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10666328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com