【问题标题】:Accessing a repeated element in the list and printing the element next to it访问列表中的重复元素并打印它旁边的元素
【发布时间】:2015-07-17 04:53:10
【问题描述】:

我有这个函数,它需要 3 个参数。 1) 包含字符串的列表,2) search_term 和 3) place(可选参数)。

代码:

def ls_src(list,search_term,place=1):
    if search_term in list:
        a = list[list.index(search_term)+1]+':' + '\tThe second element of of search term is ' + (search_term[place])
        return a

现在我想访问 search_term 旁边的元素,但如果该元素在列表中重复,它还应该考虑该元素的其他出现,而不仅仅是该元素的第一次出现。

如果list_search(['a','b','c','a','e'],'a') 那么,函数应该返回 'b' 和 'e' 两者,因为它们是 'a' 旁边的元素。

所以我的问题是,我们如何访问其他出现的“a”,而不仅仅是第一次出现。

【问题讨论】:

  • 不建议在 Python 中使用list 作为变量名。
  • 我只是这里的初学者。所以谢谢你的建议。我会处理的。
  • listsearch(['a','b', 'a'], 'a') 的预期行为是什么?
  • 如果是['a', 'a', 'b'],搜索'a' 时的预期输出是['a','b'] 还是只是['a']

标签: python list find-occurrences


【解决方案1】:

您需要使用enumerate 函数来帮助获取元素及其索引。

def list_search(l, s):
    for i,j in enumerate(l):
        if j == s:
            print(l[i+1])

list_search(['a','b','c','a','e'],'a')  

输出:

b
e

搜索元素也有可能出现在最后,所以把print语句放在tryexcept块里面。

def list_search(l, s):
    for i,j in enumerate(l):
        if j == s:
            try:
                print(l[i+1])
            except IndexError:
                pass    

list_search(['a','b','c','a','e', 'a'],'a') 

【讨论】:

  • a 是输入列表中的最后一个元素时,您需要满足当前代码的索引超出范围
  • 我认为函数应该返回列表而不是打印,根据 OP。
  • 但是有没有更简单的方法来解决这个问题?我的意思是除了使用枚举函数之外的任何其他方式。
【解决方案2】:

如果您更喜欢描述性更强的代码,您可以采用这样的方法。它有点长,但您避免使用一个字符变量。

这提供的另一个方面是,如果查询字符串跟随其自身,它将不会被返回。这可以通过删除最后一个 if 测试来改变。

def search_terms(terms, query):
    found = []
    count = len(terms)
    for index, term in enumerate(terms):
        next_index = index + 1
        if term == query and next_index < count and terms[next_index] != query:
            found.append(terms[next_index])
    return found

print search_terms(['a', 'a', 'b', 'c', 'a', 'e', 'a'], 'a')
# ['b', 'e']

【讨论】:

    【解决方案3】:

    您可以使用迭代器和next() 函数来构建新列表。

    def list_search(input_list, search_term, place=1):
        terms = iter(input_list)
        new_list = []
        try:
            [new_list.append(terms.next()) for term in terms if term == search_term[place-1]]
        except StopIteration:
            pass
        return new_list
    
    
    tests = [
        (['a','b','c','a','e'], 'a', 1),
        (['a','b','c','a','e'], 'b', 1),
        (['a','b','c','a','e'], 'ab', 2),
        (['a','b','c','a','e'], 'e', 1),
        (['a','a','a'], 'b', 1),
        (['a','a','a'], 'a', 1)]
    
    for input_list, search_term, place in tests:
        print list_search(input_list, search_term, place)
    

    这些测试将为您提供以下结果:

    ['b', 'e']
    ['c']
    ['c']
    []
    []
    ['a']
    

    【讨论】:

    • 我试过这段代码,但问题是它不能在 python3 中运行,因为其中没有名为 'next()' 的函数,但它对 python2 工作得很好。
    • 我认为对于 Python3,您只需将其替换为 next(terms)。不过目前无法在这里进行测试。
    【解决方案4】:

    代码:

    def search(l,term):
    
        for num in range(len(l)):
    
            if l[num]==term:
    
                print (l[num+1])
    

    搜索(['python','html','python','c++','python','java'],'python')

    输出:

    html
    
    c++
    
    java
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      • 2015-06-24
      • 1970-01-01
      • 1970-01-01
      • 2022-07-19
      • 1970-01-01
      相关资源
      最近更新 更多