【问题标题】:How to index, remove and count all instances of an element within a list?如何索引,删除和计算列表中元素的所有实例?
【发布时间】:2019-06-21 14:13:24
【问题描述】:

我是 Python 新手,我正在尝试学习有关列表的知识。在这种情况下,我的目标是索引、计数和删除列表中元素的所有实例。索引,计数和删除都可以单独工作,但我正在努力合并它并获得所需的结果。我做错了什么?

def removing(letter,lst):
    '''This function should index and remove all entries of a letter within a list, returning the removed items' position within the original list. I then use len() function on the result-list to determine how many items have been indexed/deleted'''
    result=[]
    offset= -1
    list_new = lst.copy()
    while True:
        try:
            offset=list_new.index(letter, offset+1)
        except ValueError:
            return result
            print('Letter not found.')
        result.append(offset)
        lst.remove(letter)

现在我希望即使不克隆列表,这也能解决问题,函数返回字母的位置并删除它们,但是当我定义 lstletter 时,运行函数然后说:

print(len(removing(letter,lst)))

它总是说 0。这是为什么呢?

编辑:有人建议我调用一次函数并存储结果,但是当我执行以下操作时,结果是一样的:

c=1
print(lst)
while (c==1):
    letter=input('What letter do you want to remove?\n')
    if letter in lst:
        var=removing(letter,lst)
        print(var)
        print(str(len(var))+' letters have been removed.')
        print(lst)
    else:
        c-1

【问题讨论】:

  • 你用什么输入来测试这个?我尝试的前几个似乎工作正常。
  • 只是一个小问题,但是在您的 return 语句之后有print('Letter not found.')...该行将永远不会被执行。
  • @TrebuchetMS 好的,很高兴知道,为什么? :-)
  • @PatrickHaugh 对于我使用的输入(测试方式): satz='Dies soll in eine Liste übertragen werden。' lst=[] lst.extend(satz)
  • 这个函数应该修改传入的列表吗? lst.remove(letter) 正在删除 lst 中的所有字母,因此当您再次调用 removing 时,列表中还剩下 0 个该字母。

标签: python python-3.x list function


【解决方案1】:

谢谢大家的帮助,我的问题已经得到解答。问题不在函数中,而是我多次调用该函数而不存储结果。最终代码如下所示:

    lst= list('Nach langem rumprobieren haben nette Menschen mir bei der Vollendung dieser kleinen Übungsaufgabe geholfen.')

    def removing(letter,lst):
        'This function should remove all entries of a letter within a list'
    result=[]
    offset= -1
    list_new = lst.copy()
    while True:
        try:
            offset=list_new.index(letter, offset+1)
        except ValueError:
            return result
        result.append(offset)
        lst.remove(letter)

    c=1
    print(lst)
    while (c==1):
        letter=input('What letter do you want to remove?\n')
        if letter in lst:
            var=removing(letter,lst)
            print(var)
            print(str(len(var))+' letters have been removed.')
            print(lst)
        else:
            break

【讨论】:

  • 请注意,您的 c-1 实际上不会更改 c 的值。请改用c -= 1。 (或者只是break
  • facepalm 应该注意到,当休息从未发生过。
【解决方案2】:

您的循环不是必需的,它将无限循环。试试下面的

lst = list('abracadabra')
letter = 'a'

var=removing(letter,lst)
print(var)  # [0, 3, 5, 7, 10]
print(str(len(var))+' letters have been removed.')  # 5 letters have been removed.
print(lst)  # ['b', 'r', 'c', 'd', 'b', 'r']

另一种以更 Python 的方式编写函数的方式是

def remove(lst, item):
    new_list = []
    indices = []
    for i, x in enumerate(lst):
        if x == item:
            indices.append(i)
        else:
            new_list.append(x)
    return new_list, indices

【讨论】:

  • 你是对的。我制作循环只是为了重复执行此操作。再次感谢您。
  • re.sub('a', '', 'abracadabra')这样使用re.sub会不会更简单?
  • @accdias 这不符合返回已删除索引列表的要求。
  • 哦!我知道了。所以可以使用re.finditer()
  • 类似[i.span()[0] for i in re.finditer('a', 'abracadabra')] 的东西会给出abracadabra 中所有a 出现的索引列表。
【解决方案3】:

这是我的解决方案:

import re

def removing(c, s):
    '''This function removes all occurences of 'c' in 's' and return a list of the replaced indices'''
    indices = [i.span()[0] for i in re.finditer(c, s)]
    return s.replace(c, ''), indices

这是使用示例:

>>> removing('a', 'abracadabra')
('brcdbr', [0, 3, 5, 7, 10])
>>> 
>>> removing('a', 'aaaaa')
('', [0, 1, 2, 3, 4])
>>> 

【讨论】:

  • 有趣。我不认识这些运营商。会调查他们。谢谢
  • 很高兴为您提供帮助,如果您将其中一个答案标记为有效解决问题,那就太好了。这肯定会帮助其他有相同问题的用户。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 2010-10-12
  • 1970-01-01
  • 2019-08-20
  • 2012-01-02
相关资源
最近更新 更多