在Python中对字符串进行列表遮罩

-3 投票
3 回答
616 浏览
提问于 2025-04-20 19:15

我有以下内容:

  str1 ='-CGCG-G'
  ls1 = [0,1,2,3,4,5,6]
  # length of ls and str always the same
  # and the value of ls1 can be anything. It is not the index of str1

我想做的是根据 str1 来筛选列表 l1,也就是说,只有当字符串中对应的位置不是 - 时,才保留列表中的元素。这样得到的结果是:

output = [1,2,3,4,6]

我该如何在 Python 中方便地实现这个呢?我查看了 itertools.compress,但我想不出怎么用它来达到我的目的。

3 个回答

1

另一种方法是使用 enumerate() 函数:

>>> str1 ='-CGCG-G'
>>> ls1 = [0,1,2,3,4,5,6]
>>> [a for idx, a in enumerate(a) if str1[idx] != '-']
[1, 2, 3, 4, 6]
2

你也可以使用 itertools.compress 来实现这个功能。

>>> from itertools import compress
>>> ls1 = [0, 1, 2, 3, 4, 5, 6]
>>> str1 = '-CGCG-G'
>>> f = compress(ls1, [0 if j == '-' else 1 for j in list(str1)])    # compress([0, 1, 2, 3, 4, 5, 6], [0, 1, 1, 1, 1, 0, 1])
>>> filtered = [i for i in f]
>>> filtered
[1, 2, 3, 4, 6]
3

你可以用 zip 来把两个东西合在一起,然后用列表推导式来过滤掉字符串中是 - 的字符:

output = [num for char, num in zip(str1, ls1) if char != '-']

zip 函数会把两个列表“组合”在一起。在这个例子中,使用 zip(str1, ls1) 会得到:

[('-', 0), ('C', 1), ('G', 2), ('C', 3), ('G', 4), ('-', 5), ('G', 6)]

接下来,遍历这个列表就比较简单了,可以把所有字符是破折号的配对过滤掉。

撰写回答