如何根据字符串特定位置中特定字符的存在,删除等长字符串列表的成员?

很抱歉,如果我没有很好地解释这一点,但它是这样的:我有一个这样的字符串列表,它们的长度都相同:


list_strings=["abc-df-r-e","abc--daa-q","-ab-c-aub-","cbac-a-c--"]

我有一个整数列表,它们是前一个列表中字符串的位置(所以位置都是从 0 到 9,因为每个字符串的长度都是 10):


list_positions=[2,0,4,7]

我想要做的是,对于第二个列表中的每个位置,从第一个列表中删除那些位置上没有“a”、“b”、“c”或“-”的字符串。


在这种情况下,第一个字符串将被删除,因为它在位置 4 有一个“d”,第三个字符串将被删除,因为它在位置 7 有一个“u”。所以在这种情况下的输出将是:


list_strings=["abc--daa-q","cbac-a-c--"]

我试过这个,但我不知道这是否是最好的方法:


list_approved=["a","b","c","-"]

for i in list_strings:

     for j,k in enumerate(i):

          if j in list_positions:

               if i[j] not in list_approved:

                    list_strings.remove(i)

               else:

                    pass

提前感谢任何答案


holdtom
浏览 89回答 3
3回答

阿波罗的战车

列表理解的解决方案:list_strings=["abc-df-r-e","abc--daa-q","-ab-c-aub-","cbac-a-c--"]list_positions=[2,0,4,7]list_strings = [s for s in list_strings if not any(ch not in 'abc-' and i in list_positions for i, ch in enumerate(s))]print(list_strings)印刷:['abc--daa-q', 'cbac-a-c--']编辑:感谢@David Wierichs,一个更快的解决方案:list_strings = [s for s in list_strings if not any(s[i] not in 'abc-' for i in list_positions)]

小唯快跑啊

一个好的 pythonic 方法是使用“filter”函数,它可以使用特定的、用户定义的过滤器从列表中过滤出来。为此,您需要该函数知道 list_approved 以便它可以相应地过滤掉,为此,您可以使用包装器或“部分”函数。出于简单的原因,我们将使用来自 functools 的 partial。此函数允许在不同时间发送函数参数,有关更多信息,请查看:https://docs.python.org/2/library/functools.html#functools.partial此代码确实根据您的规则过滤掉from functools import partiallist_strings=["abc-df-r-e","abc--daa-q","-ab-c-aub-","cbac-a-c--"]list_positions=[2,0,4,7]list_approved=["a","b","c","-"]def filter_out_according_to_position(list_positions, list_approved, currnet_string):    return all([currnet_string[i] in list_approved for i in list_positions])new_list = list(filter(partial(filter_out_according_to_position, list_positions, list_approved), list_strings))print(new_list)希望有所帮助

qq_笑_17

在列表本身上迭代时,您可能不会删除元素,因为这会破坏索引并且您不会检查最后的每个元素。使用您的代码,"cbdc-a-c--"例如未经过测试。使用有意义的名字直接使用变量letter,而不是word[idx_letter]结合 2 个如果到达禁止字母时使用 abreak停止内循环迭代list(list_strings),这会复制列表,然后您可以list_strings毫无问题地从中删除for word in list(list_strings):    for idx_letter, letter in enumerate(word):        if idx_letter in list_positions and letter not in list_approved:            list_strings.remove(word)            breakprint(list_strings)另一个要看的是:使用列表理解保留匹配的词list_strings = [word for word in list_strings                if not any(letter not in list_approved and i in list_positions for i, letter in enumerate(word))]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python