Python:如何在未排序的列表中查找大于某个数字的所有项(大数据集)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python:如何在未排序的列表中查找大于某个数字的所有项(大数据集),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2366字,纯文字阅读大概需要4分钟。
内容图文
尽管如此,其他人也曾提出过类似的问题. here,但他们略有不同,并没有真正解决我的问题,所以我再来一次.
我有N个列表(N> 20,000),每个列表包含M个列表(M> 20,000),方式如下(数据为虚拟):
Key1: [ [4,3,1], [5,1,0] ...... [43,21,0 ] ] # List 1 with collection of M smaller lists
:
:
KeyN: [ [5,4,1], [55,1,1] ...... [ 221, 0, 0] ] # Nth list
数据未分类.逐个迭代一个阈值列表,比如阈值= [2,3,5,7,8],其中阈值应用于中间元素,我想提取所有键的所有元素,大于门槛值.对于前者根据我上面写的数据,Threshold = 2会产生
For Key1: [ [4,3,1], [43,21,0]]
:
:
For KeyN: [[5,4,1]]
同样对于其他阈值也是如此.由于列表太多,我的观察是排序会导致很多开销,因此我想避免它.在python中执行此操作的最佳方法是什么?另外一个重点是,我自己构建数据,因此可能有一个更好的数据结构来存储数据.我目前将数据以PersistentList的形式存储在ZODB的Btree容器中,建议使用here.以下是用于它的代码片段:
for Gnodes in G.nodes(): # Gnodes iterates over N values
Gvalue = someoperation(Gnodes)
for Hnodes in H.nodes(): # Hnodes iterates over N values
Hvalue =someoperation(Hnodes,Gnodes)
score = SomeOperation on (Gvalue,Hvalue)
btree_container.setdefault(Gnodes, PersistentList()).append([Hnodes, score, -1 ])
transaction.savepoint(True)
transaction.commit()
关于什么应该是最有效的方法的任何建议?排序第一的确是最佳方式吗?
解决方法:
使用生成器理解:
(sublist for sublist in Key1 if sublist[1] > Threshold)
生成器只按需计算元素,因为它按顺序遍历列表的元素,所以不需要排序. (也就是说,它在每个Keyn的长度上以线性时间运行,而不是用于排序的M * log(M).)
等效地,在函数式中(仅在Python 3中等效;对于Python 2,使用itertools.ifilter):
filter(lambda sublist: sublist[1] > Threshold, Key1)
如果您的Keyn列表存储在列表(或其他可订阅对象)中,您可以一次处理它们(显示一些替代样式):
filtered_Keys = [(sublist for sublist in Key if sublist[1] > Threshold)
for Key in Keys
]
要么
filtered_Keys = list(map(
lambda Key: filter(lambda sublist: sublist[1] > Threshold, Key1),
Keys
))
此方法相对于排序的性能
此方法是否比排序更快取决于M和您拥有的阈值T的数量.运行时间(对于每个键列表)是O(M * T).如果您对列表进行排序(O(M * log(M))),则可以对每个阈值使用二进制搜索,总运行时间为O(M * log(M)T * log(M))= O (max(M,T)* log(M)).当T相对于M足够大时,排序更快.我们无法先验地知道常数,因此测试两种方式以确定在给定数据的情况下是否更快.
如果两者都不够快,请考虑编写自己的线性时间排序.例如,radix sort can be generalized to work on (non-negative) floats.如果你真的关心这里的性能,你可能不得不把它写成C或Cython扩展.
内容总结
以上是互联网集市为您收集整理的Python:如何在未排序的列表中查找大于某个数字的所有项(大数据集)全部内容,希望文章能够帮你解决Python:如何在未排序的列表中查找大于某个数字的所有项(大数据集)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。