python中merge怎么补全股票_python中的merge-join两个生成器

本文介绍了一个名为orderedMerge的函数,该函数能够接受多个已排序的迭代器并返回一个单一的有序生成器。此外,文中还提供了一个IterableCursor类,用于扩展Kyoto Cabinet库中的Cursor类以实现迭代器接口。

我认为这正是您需要的;orderedMerge基于Gnibbler的代码,但添加了一个自定义键函数和一个唯一的参数import kyotocabinet

import collections

import heapq

class IterableCursor(kyotocabinet.Cursor, collections.Iterator):

def __init__(self, *args, **kwargs):

kyotocabinet.Cursor.__init__(self, *args, **kwargs)

collections.Iterator.__init__(self)

def next():

"Return (key,value) pair"

res = self.get(True)

if res is None:

raise StopIteration

else:

return res

def orderedMerge(*iterables, **kwargs):

"""Take a list of ordered iterables; return as a single ordered generator.

@param key: function, for each item return key value

(Hint: to sort descending, return negated key value)

@param unique: boolean, return only first occurrence for each key value?

"""

key = kwargs.get('key', (lambda x: x))

unique = kwargs.get('unique', False)

_heapify = heapq.heapify

_heapreplace = heapq.heapreplace

_heappop = heapq.heappop

_StopIteration = StopIteration

# preprocess iterators as heapqueue

h = []

for itnum, it in enumerate(map(iter, iterables)):

try:

next = it.next

data = next()

keyval = key(data)

h.append([keyval, itnum, data, next])

except _StopIteration:

pass

_heapify(h)

# process iterators in ascending key order

oldkeyval = None

while True:

try:

while True:

keyval, itnum, data, next = s = h[0] # get smallest-key value

# raises IndexError when h is empty

# if unique, skip duplicate keys

if unique and keyval==oldkeyval:

pass

else:

yield data

oldkeyval = keyval

# load replacement value from same iterator

s[2] = data = next() # raises StopIteration when exhausted

s[0] = key(data)

_heapreplace(h, s) # restore heap condition

except _StopIteration:

_heappop(h) # remove empty iterator

except IndexError:

return

那么你的功能可以作为

^{pr2}$

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值