- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我是 python 的新手,并且不断学习如何在 python 中构建更好的代码。我有两个 list ;一个索引存储在 x 变量中,其中 x 中的索引表示名为 bb 的列表中带有字符串 ('IN') 的元组的索引,并且在两侧至少被一个包含 'NN' 的元组包围。
我想从下面的代码中得到的是,从 bb 中 x 中提到的每个索引,在 bb 列表中的字符串元组的两侧出现了多少个以 'NN' 开头的连续字符串。
我试过下面的代码,但代码效率不够。请任何人帮助我提高代码效率。
bb = [('The', 'RB'),
('company', 'NN'),
('whose', 'NNS'),
('stock', 'IN'),
('has', 'NNP'),
('been', 'NNS'),
('on', 'NNP'),
('tear', 'VBJ'),
('this', 'VB'),
('week', 'NNS'),
('already', 'NN'),
('sells', 'IN'),
('its', 'NNP'),
('graphics', 'NNS'),
('processing', 'VB'),
('units', 'VBJ'),
('biggest', 'NNS'),
('cloud', 'NN'),
('companies', 'IN'),
('just', 'NNP'),
('that', 'IN')]
def solvr(bb):
x = []
for i in range(len(bb)-1):
if bb[i][1] == 'IN':
if 'NN' in (bb[i-1][1]) and 'NN' in (bb[i+1][1]):
x.append(i)
#===============================
for i in range(len(bb)-1):
if i in x:
k=[]
front = bb[i+1:]
v = 0-i
back = bb[:-v]
#======================
for i in back:
if 'NN' in i[1]:
k.append(i[0])
[[] for i in k]
#================================
for i, j in enumerate(front):
if front[i][1][:2] == 'NN':
k.append(front[i][0])
else:
break
return(k)
>> solvr(bb)
output:
['company',
'whose',
'has',
'been',
'on',
'week',
'already',
'its',
'graphics',
'biggest',
'cloud',
'just']
我对代码的期望是在新列表中获取每个迭代结果,每个列表中还包含“IN”字符串。
[['company', 'whose', 'stock', 'has', 'been', 'on'],
['week', 'already', 'sells', 'its', 'graphics'],
['biggest', 'cloud', 'companies', 'just']]
如果有人对我的代码进行任何更改,我将不胜感激。
最佳答案
这对 itertools.groupby
来说似乎是个好问题根据您定义的某些条件,它根据每个元素是否为真将列表的连续元素分组在一起。
在您的情况下,您可以使用以下内容:
groups = itertools.groupby(bb, lambda x: x[1][:2] in ['IN', 'NN'])
result = [list(b) for a,b in groups if a]
result = [[w[0] for w in b] for b in result if 'IN' in [w[1] for w in b]]
print(result)
[['company', 'whose', 'stock', 'has', 'been', 'on'],
['week', 'already', 'sells', 'its', 'graphics'],
['biggest', 'cloud', 'companies', 'just', 'that']]
这是有效的,因为每当条件(第二个元素是“IN”或以“NN”开头)从假变为真(反之亦然)时,groups 会将您的原始 bb
列表拆分为子列表).如果我们显示组,您可以看到它是如何拆分的:
groups = itertools.groupby(bb, lambda x: x[1][:2] in ['IN', 'NN'])
print([(a,list(b)) for a,b in groups])
[(False, [('The', 'RB')]),
(True,
[('company', 'NN'),
('whose', 'NNS'),
('stock', 'IN'),
('has', 'NNP'),
('been', 'NNS'),
('on', 'NNP')]),
(False, [('tear', 'VBJ'), ('this', 'VB')]),
(True,
[('week', 'NNS'),
('already', 'NN'),
('sells', 'IN'),
('its', 'NNP'),
('graphics', 'NNS')]),
(False, [('processing', 'VB'), ('units', 'VBJ')]),
(True,
[('biggest', 'NNS'),
('cloud', 'NN'),
('companies', 'IN'),
('just', 'NNP'),
('that', 'IN')])]
bool 值表示以下列表是否包含满足或不满足条件的元素。现在您所要做的只是保持 one's who 的 bool 值为真(满足条件),然后将包含 'IN'
的子列表保留为词性标记之一。
只是为了好玩,如果您希望将整个解决方案作为一个(几乎不可读的长)单行,您可以使用:
[[w[0] for w in b] for b in [list(b) for a,b in itertools.groupby(bb, lambda x: x[1][:2] in ['IN', 'NN']) if a] if 'IN' in [w[1] for w in b]]
编辑
为了仅保留包含 'IN
' 字词的子列表,并且 至少有一个 'NN'
字词在你的任一侧可以执行以下操作:
从与之前相同的初始 groups
和 results
变量开始:
groups = itertools.groupby(bb, lambda x: x[1][:2] in ['IN', 'NN'])
result = [list(b) for a,b in groups if a]
将相同的 groupby
函数应用于子列表,但这次将条件设置为词性等于 'IN'
:
result = [[(a,list(b)) for a,b in itertools.groupby(r, lambda x: x[1] == 'IN')] for r in result]
现在遍历 result
并删除子列表中 groupby
的 bool 值为真(POS 为 'IN'
)的任何元素并且它位于子列表的右边缘或左边缘(索引为 0
或 -1
)
result = [[b for i,(a,b) in enumerate(r) if (a and i not in [0,len(r)-1]) or not a] for r in result]
现在我们已经删除了这些,我们可以将所有内容连接在一起并删除 POS 标签以获得正确的输出格式(有关列表展平语法的详细信息,请参阅 here)
result = [[w[0] for sub in r for w in sub] for r in result]
print(result)
[['company', 'whose', 'stock', 'has', 'been', 'on'],
['week', 'already', 'sells', 'its', 'graphics'],
['biggest', 'cloud', 'companies', 'just']]
关于python - 如何在 Python 的某些条件下根据其他列表中的索引列表从一个列表中查找字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43936198/
这几天我一直在努力。我一直在自学 CSS,所以对菜鸟好一点。我正在创建一个推荐 slider 。推荐以 3 个 block 显示。我希望前 2 个下降,第 3 个上升。但是当 slider 激活时,无
我最近开始学习 Nodejs,现在我很困惑我的网络应用程序使用什么,html 还是 ejs (Express)。 Ejs 使用 Express 模块,而 .html 使用 HTML 模块。我的第一个问
假设我们有一个 PostgreSQL 表contacts,每条记录都有一堆带标签的电子邮件地址(标签和电子邮件对)——其中一个是“主要”。 存储方式如下: id 主键 电子邮件 文本 email_la
我成功为一种新的tesseract语言编写了traineddata文件,但是当我完成时,我继续收到以下错误: index >= 0 && index = 0 && 索引 < size_used_ :E
这个问题已经有答案了: How to deal with SettingWithCopyWarning in Pandas (21 个回答) 已关闭 4 年前。 假设我有一个像这样的数据框,第一列“密
如果我有一个位置或行/列同时用于 A 和 B 位置,请检查 B 是否与 A 成对角线? 1 2 3 4 5 6 7 8 9 例如,我如何检查 5 是否与 7 成对角线? 此外,如果我检查 4 是
MongoDB:索引 一、 创建索引 默认情况下,集合中的_id字段就是索引,我们可以通过getIndexes()方法来查看一个集合中的索引 > db.user.getIndexes() [ { "v
一、索引介绍 索引是一种用来快速查询数据的数据结构。 B+Tree就是一种常用的数据库索引数据结构,MongoDB采用B+Tree 做索引,索引创建在colletions上。 MongoDB不使用索引
我无法决定索引。 就像我有下面的查询需要太多时间来执行: select count(rn.NODE_ID) as Count, rnl.[ISO_COUNTRY_CODE] as Cou
我有这些表: CREATE TABLE `cstat` ( `id_cstat` bigint(20) NOT NULL, `lang_code` varchar(3) NOT NULL,
我正在尝试找到一种方法来提高包含 IP 范围的 mysql 表的性能(在高峰时段每秒最多有 500 个 SELECT 查询(!),所以我有点担心)。 我有一个这种结构的表: id smallint(
jquery index() 似乎无法识别元素之一,总是说“无法读取未定义的属性‘长度’”这是我的代码。mnumber 是导致问题的原因。我需要 number 和 mnumber 才能跟踪使用鼠标,并
我们有一个包含近 4000 万条记录的 MongoDB 集合。该集合的当前大小为 5GB。此集合中存储的数据包含以下字段: _id: "MongoDB id" userid: "user id" (i
文档说:如果你有多个字段的复合索引,你可以用它来查询字段的开始子集。所以如果你有一个索引一个,乙,丙你可以用它查询一种一个,乙a,b,c 我的问题是,如果我有一个像这样的复合索引一个,乙,丙我可以查询
我正在使用 $('#list option').each(function(){ //do stuff }); 循环列表中的选项。我想知道如何获取当前循环的索引? 因为我不想让 var i = 0;循
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL
SQLite 索引(Index) 索引(Index)是一种特殊的查找表,数据库搜索引擎用来加快数据检索。简单地说,索引是一个指向表中数据的指针。一个数据库中的索引与一本书后边的索引是非常相似的。
我是 RavenDB 的新手。我正在尝试使用多 map 索引功能,但我不确定这是否是解决我的问题的最佳方法。所以我有三个文件:Unit、Car、People。 汽车文件看起来像这样: { Id: "
我有以下数据,我想根据范围在另一个表中建立索引 我想要实现的是,例如,如果三星的销售额为 2500,则折扣为 2%,低于 3000 且高于 1000 我知道它可以通过索引来完成,与多个数组匹配,然后指
我正在检查并删除 SQL 数据库中的重复和冗余索引。 所以如果我有两个相同的索引,我会删除。 例如,如果我删除了重叠的索引... 索引1:品牌、型号 指标二:品牌、型号、价格 我删除索引 1。 相同顺
我是一名优秀的程序员,十分优秀!