在Python中按排序顺序从排序的迭代器中产生?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在Python中按排序顺序从排序的迭代器中产生?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1221字,纯文字阅读大概需要2分钟。
内容图文
![在Python中按排序顺序从排序的迭代器中产生?](/upload/InfoBanner/zyjiaocheng/700/a9191bda015d4caabc931ead4aee4208.jpg)
是否有更好的方法将一堆已排序的迭代器合并/整理成一个,以便按排序顺序生成项目?我认为下面的代码可以工作,但我觉得有一种更清晰,更简洁的方法,我错过了.
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中按排序顺序从排序的迭代器中产生?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。