为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

holdtom 2023-01-04 16:52:13

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


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

提前感谢任何答案


查看完整描述

3 回答

?
阿波罗的战车

TA贡献1607条经验 获得超6个赞

列表理解的解决方案:


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)]



查看完整回答
反对 回复 2023-01-04
?
小唯快跑啊

TA贡献1619条经验 获得超2个赞

一个好的 pythonic 方法是使用“filter”函数,它可以使用特定的、用户定义的过滤器从列表中过滤出来。为此,您需要该函数知道 list_approved 以便它可以相应地过滤掉,


为此,您可以使用包装器或“部分”函数。出于简单的原因,我们将使用来自 functools 的 partial。此函数允许在不同时间发送函数参数,有关更多信息,请查看:


https://docs.python.org/2/library/functools.html#functools.partial


此代码确实根据您的规则过滤掉


from functools import partial

list_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)

希望有所帮助


查看完整回答
反对 回复 2023-01-04
?
qq_笑_17

TA贡献1568条经验 获得超7个赞

在列表本身上迭代时,您可能不会删除元素,因为这会破坏索引并且您不会检查最后的每个元素。使用您的代码,"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)

            break

print(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))]



查看完整回答
反对 回复 2023-01-04

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信