在Python中对字符串进行列表遮罩
我有以下内容:
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)]
接下来,遍历这个列表就比较简单了,可以把所有字符是破折号的配对过滤掉。