在列表中搜索项目并在 python 中返回 x 个周围项目

Posted

技术标签:

【中文标题】在列表中搜索项目并在 python 中返回 x 个周围项目【英文标题】:Search a list for item(s)and return x number of surrounding items in python 【发布时间】:2013-01-03 00:49:56 【问题描述】:

我想在列表中搜索某个值 (x) 的出现情况并返回该值以及索引中高于和低于 x 的值的一个数字,例如 2。值 x 可能会多次出现在列表中。

输入

in = ['a','b','c','d','x','e','f','g','h','i','x','j','k','l']

输出

out = ['c','d','x','e','f','h','i','x','j','k']

感谢您的帮助或建议

【问题讨论】:

【参考方案1】:
In [8]: lis = ['a','b','c','d','x','e','f','g','h','i','x','j','k','l']

#create a new list containing all the index positions of 'x'

In [9]: ind=[i for i,x in enumerate(lis) if x=='x']

In [10]: out=[]

# loop over ind list, and for every index i:
# here lis[i-2:i] are the elements left to the 'x' and similarly lis[i:i+3]
# are the ones to its right.
# which is  simply  lis[i-2:i+3] as suggested by @volatility

In [11]: for i in ind:
    out.extend(lis[i-2:i+3])

   ....:     


In [12]: out
Out[12]: ['c', 'd', 'x', 'e', 'f', 'h', 'i', 'x', 'j', 'k']

使用itertools.chain() 的单行代码:

In [19]: from itertools import *

In [20]: list(chain(*[lis[i-2:i+3] for i in ind]))
Out[20]: ['c', 'd', 'x', 'e', 'f', 'h', 'i', 'x', 'j', 'k']

【讨论】:

+1:我的解释是错误的。还要考虑边界条件(列表两端的“x”)。 你可以在for循环中做out.extend(lis[i-2:i+3]) @Abhijit 我不确定在这些情况下的预期输出是什么。 谢谢大家。 @AshwiniChaudhary 边界条件将包括 x 如果在边界处找到。您的解决方案非常有帮助。【参考方案2】:
l = ['a','b','c','d','x','e','f','g','h','i','x','j','k','l']


def search_w(mylist,item,before=1,after=1):
    newl=[]
    l = mylist[:]
    while item in l:
        i = l.index(item)
        newl+= l[i-before:i+after+1]
        l = l[i+after:]
    return newl


>>> print search_w(l,'x',2,2)

['c', 'd', 'x', 'e', 'f', 'h', 'i', 'x', 'j', 'k']

【讨论】:

【参考方案3】:

使用difflib.SequenceMatcher 的替代解决方案

>>> from itertools import chain
>>> from difflib import SequenceMatcher
>>> in_data = ['a','b','c','d','x','e','f','g','h','i','x','j','k','l']
>>> sm = SequenceMatcher(None, in_data, 'x'*len(in_data)).get_matching_blocks()
>>> list(chain(*(in_data[m.a -2 : m.a + 3] for m in sm[:-1])))
['c', 'd', 'x', 'e', 'f', 'h', 'i', 'x', 'j', 'k']

【讨论】:

@AshwiniChaudhary:将我的解决方案更改为使用 difflib.SequenceMatcher @AshwiniChaudhary:您的解决方案更快,但是当 needle 是多字符串时,应该选择这个。

以上是关于在列表中搜索项目并在 python 中返回 x 个周围项目的主要内容,如果未能解决你的问题,请参考以下文章

Python在列表或数组中查找范围之间的数字

如何比较 2 个列表并在 Python 中获取 True 或 False 列表? [复制]

如何在多个文件中搜索字符串并在 Excel 或 Powershell 中的 csv 中返回带有行号/文本的文件名

23个Python爬虫开源项目代码

如何在列表中查找项目的索引,在 Python 中使用正则表达式搜索项目?

在使用数字列表搜索列后返回数据框中的所有行 - Python/Pandas