gpt4 book ai didi

python - 在 Python 中按排序顺序从排序的迭代器中产生?

转载 作者:太空狗 更新时间:2023-10-29 18:16:32 24 4
gpt4 key购买 nike

有没有更好的方法将一堆排序的迭代器合并/整理成一个,以便它按排序顺序生成项目?我认为下面的代码有效,但我觉得我缺少一种更简洁、更简洁的方法。

def sortIters(*iterables, **kwargs):
key = kwargs.get('key', lambda x : x)
nextElems = {}
currentKey = None
for g in iterables:
try:
nextElems[g] = g.next()
k = key(nextElems[g])
if currentKey is None or k < currentKey:
currentKey = k
except StopIteration:
pass #iterator was empty
while nextElems:
minKey = None
stoppedIters = set()
for g, item in nextElems.iteritems():
k = key(item)
if k == currentKey:
yield item
try:
nextElems[g] = g.next()
except StopIteration:
stoppedIters.add(g)
minKey = k if minKey is None else min(k, minKey)
currentKey = minKey
for g in stoppedIters:
del nextElems[g]

这个用例是我有一堆 csv 文件,我需要根据某个排序字段合并这些文件。它们足够大,我不想将它们全部读入列表并调用 sort()。我正在使用 python2.6,但如果有 python3 的解决方案,我仍然有兴趣看到它。

最佳答案

是的,你想要heapq.merge()它只做一件事;按顺序迭代排序的迭代器

def sortkey(row):
return (row[5], row)

def unwrap(key):
sortkey, row = key
return row

from itertools import imap
FILE_LIST = map(file, ['foo.csv', 'bar.csv'])
input_iters = imap(sortkey, map(csv.csvreader, FILE_LIST))
output_iter = imap(unwrap, heapq.merge(*input_iters))

关于python - 在 Python 中按排序顺序从排序的迭代器中产生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6928421/

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