- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 python 中过滤大文件中的重叠行。
两行和另外两行的重叠度设置为 25%。也就是说,重叠度为 a*b/(c+d-a*b)>0.25
, a
是第一行和第三行之间的交集数,b
是第 2 行和第 4 行之间的交集数,c
是第一行的元素数量乘以第二行的元素数量,d
是第 3 行的元素数量乘以第 4 行的元素数量。如果重叠度大于0.25,则删除第3行和第4行。因此,如果我有一个总共有 1000 000 行的大文件,则前 6 行如下:
c6 c24 c32 c54 c67
k6 k12 k33 k63 k62
c6 c24 c32 c51 c68 c78
k6 k12 k24 k63
c6 c32 c24 c63 c67 c54 c75
k6 k12 k33 k63
因为第1两行和第2行的重叠度为a=3
,(如c6,c24,c32
),b=3
,(如 k6,k12,k63
), c=25,d=24
, a*b/(c+d-a*b)=9/40<0.25
,第3行和第4行不被删除。接下来第1两行和第3两行的重叠度为5*4/(25+28-5*4)=0.61>0.25
,删除第三两行。
最终答案是第一和第二两行。
c6 c24 c32 c54 c67
k6 k12 k33 k63 k62
c6 c24 c32 c51 c68 c78
k6 k12 k24 k63
伪代码如下:
for i=1:(n-1) # n is a half of the number of rows of the big file
for j=(i+1):n
if overlap degrees of the ith two rows and jth two rows is more than 0.25
delete the jth two rows from the big file
end
end
end
Python代码如下,但错误。如何解决?
with open("iuputfile.txt") as fileobj:
sets = [set(line.split()) for line in fileobj]
for first_index in range(len(sets) - 4, -2, -2):
c=len(sets[first_index])*len(sets[first_index+1])
for second_index in range(len(sets)-2 , first_index, -2):
d=len(sets[second_index])*len(sets[second_index+1])
ab = len(sets[first_index] | sets[second_index])*len(sets[first_index+1] | sets[second_index+1])
if (ab/(c+d-ab))>0.25:
del sets[second_index]
del sets[second_index+1]
with open("outputfile.txt", "w") as fileobj:
for set_ in sets:
# order of the set is undefined, so we need to sort each set
output = " ".join(set_)
fileobj.write("{0}\n".format(output))
类似的问题可以在https://stackoverflow.com/questions/17321275/中找到
如何修改该代码来解决Python中的这个问题?谢谢!
最佳答案
我一直在思考如何以更好的方式解决这个问题,而不需要所有的逆向和索引之类的东西,我想出了一个更长、更复杂的解决方案,但更容易阅读,更漂亮,恕我直言,更易于维护和扩展。
首先,我们需要一种特殊类型的列表,即使其中的项目被删除,我们也可以“正确”地迭代它。 Here是一篇博客文章,详细介绍了列表和迭代器的工作原理,阅读它将帮助您了解这里发生的事情:
class SmartList(list):
def __init__(self, *args, **kwargs):
super(SmartList, self).__init__(*args, **kwargs)
self.iterators = []
def __iter__(self):
return SmartListIter(self)
def __delitem__(self, index):
super(SmartList, self).__delitem__(index)
for iterator in self.iterators:
iterator.item_deleted(index)
我们扩展了内置的list
并使其返回自定义迭代器而不是默认迭代器。每当列表中的项目被删除时,我们都会调用 item_deleted
self.iterators
中每一项的方法列表。这是 SmartListIter
的代码:
class SmartListIter(object):
def __init__(self, smartlist, index=0):
self.smartlist = smartlist
smartlist.iterators.append(self)
self.index = index
def __iter__(self):
return self
def next(self):
try:
item = self.smartlist[self.index]
except IndexError:
self.smartlist.iterators.remove(self)
raise StopIteration
index = self.index
self.index += 1
return (index, item)
def item_deleted(self, index):
if index >= self.index:
return
self.index -= 1
因此,迭代器将自身添加到迭代器列表中,并在完成后从同一列表中删除自身。如果删除索引小于当前索引的项目,我们会将当前索引减一,这样我们就不会像普通列表迭代器那样跳过项目。
next
方法返回一个元组 (index, item)
而不仅仅是项目,因为当需要使用这些类时,这会让事情变得更容易——我们不必乱搞 enumerate
.
因此,这应该能够解决必须向后返回的问题,但我们仍然需要使用大量索引来处理每个循环中的四条不同的行。由于两行和两行在一起,让我们为此创建一个类:
class LinePair(object):
def __init__(self, pair):
self.pair = pair
self.sets = [set(line.split()) for line in pair]
self.c = len(self.sets[0]) * len(self.sets[1])
def overlap(self, other):
ab = float(len(self.sets[0] & other.sets[0]) * \
len(self.sets[1] & other.sets[1]))
overlap = ab / (self.c + other.c - ab)
return overlap
def __str__(self):
return "".join(self.pair)
pair
attribute 是直接从输入文件读取的两行元组,包含换行符。我们稍后使用它将该对写回到文件中。我们还将这两行转换为一个集合并计算 c
attribute,即每对线的属性。最后,我们创建了一种方法来计算一个 LinePair 与另一个 LinePair 之间的重叠。请注意 d
消失了,因为那只是 c
另一对的属性。
现在是大结局:
from itertools import izip
with open("iuputfile.txt") as fileobj:
pairs = SmartList([LinePair(pair) for pair in izip(fileobj, fileobj)])
for first_index, first_pair in pairs:
for second_index, second_pair in SmartListIter(pairs, first_index + 1):
if first_pair.overlap(second_pair) > 0.25:
del pairs[second_index]
with open("outputfile.txt", "w") as fileobj:
for index, pair in pairs:
fileobj.write(str(pair))
请注意,阅读这里的中心循环是多么容易,而且它是多么短。如果您将来需要更改此算法,则使用此代码可能比使用我的其他代码更容易完成。 izip
用于对输入文件的两行和两行进行分组,如here所述.
关于python - 如何在python中过滤大文件中两行的重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17338309/
场景 网站页面有一个带有分页、过滤、排序功能的表格 View 。 表中的数据是从REST API服务器获取的,数据包含数百万条记录。 数据库 REST API 服务器 Web 服务器 浏览器 问
我有一个表student,其中的列dte_date(日期)具有值(2019-01-01、2019-02-01、2019-03-01)。 .等) 条件: dte_date 列中没有重复值。 但 dte_
我有一些逻辑可以根据不活动的用户创建通知。我正在获取具有以下属性的用户列表。我想做的只是在部门有非 Activity 用户时触发我的创建通知方法。因此,给出下面的列表,基本上会创建 1 个通知,表示部
使用 GPS 开发跟踪应用程序。一切都很好,但有时由于封闭区域或恶劣天气,我得到的分数不准确。当您绘制它们时,它看起来不对,有很多跃点/跳跃。 我应该运行什么算法来过滤掉不良信号对我来说,这看起来像是
我正在尝试按变量类型过滤对象数组。节点是一个具有位置的对象,但以不同的方式定义——作为点、矢量或附件。这是一个代码: class Joint { var position:Position
我想做的是在向量上创建一个过滤器,以便它删除未通过谓词测试的元素;但不太确定我该怎么做。 我根据谓词评估输入向量中的每个元素,例如在我的代码中,is_even 仿函数在 device_vector 向
我是 Gremlin 的新手,我正在使用 Gremlin 3.0.2 和 Stardog 5.0。我编写此查询是为了找出 schema.org 本体中两个实体之间的路径。以下是输出 - gremlin
考虑以下示例数据表, dt 30 的那一行需要去 - 或者如果其中两行 > 30相隔几秒钟,删除所有 3 个。然而 ,当我们有 4 行或更多行时,我们需要删除时间差 > 30 没有另一对 < 30
我正在考虑使用 ZeroMQ,并尝试了一些示例。但是,我无法验证 ZeroMQ 是否支持一些重要的要求。我希望你能帮助我。 我将使用这个简单的场景来问我的问题: 出版商(例如交易所)提供(大量)股票的
我需要从我的查询中过滤掉大量的对象。目前,它正在抓取类中的所有对象,我想将其过滤为查询字符串中的相关对象。我怎样才能做到这一点?当我尝试时,我收到一个属性错误说明 ''QuerySet' object
如何在 Prometheus 查询中添加标签过滤器? kube_pod_info kube_pod_info{created_by_kind="ReplicaSet",created_by_name=
我有包含字符串的列的数据框,并希望过滤掉包含某些字符串以外的任何内容的所有行。考虑下面的简化示例: string % dplyr::filter(stringr::str_detect(string,
我有以下数据框,其中包含多行的角度变化值: 'data.frame': 712801 obs. of 4 variables: $ time_passed: int 1 2 3 4 5 6
我有一个 BehaviorSubject我希望能够filter ,但要保持新订阅者在订阅时始终获得一个值的行为主题式质量,即使最后发出的值被过滤掉。有没有一种简洁的方法可以使用 rxjs 的内置函数来
我有一个 RSS 提要,每天输出大约 100 篇文章。我希望过滤它以仅包含更受欢迎的链接,也许将其过滤到 50 个或更少。回到当天,我相信您可以使用“postrank”来做到这一点,但在谷歌收购后现已
我有这样一个重复的xml树- this is a sample xml file yellowred blue greyredblue 如您所见,每个项目可以具有不同数量的颜色标签
我以为我在 Haskell 学习中一帆风顺,直到... 我有一个 [[Int]] tiles = [[1,0,0] ,[0,1,0] ,[0,1,0]
我在使用 Knockout.js 过滤可观察数组时遇到问题 我的js: 包含数据的数组 var docListData = [ { name: "Article Name 1", info:
我在 mongoDB 中有这个架构: var CostSchema = new Schema({ item: String, value: Number }); var Attachm
给定一个数据框“foo”,我如何才能只选择“foo”中的那些行,例如foo$location =“那里”? foo = data.frame(location = c("here", "there",
我是一名优秀的程序员,十分优秀!