在Python中屏蔽字符串列表

时间:2014-09-10 03:47:59

标签: 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

我想要做的是根据l1屏蔽列表str1, 通过保持list的成员在字符串中对应的位置不是-。 产生

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

如何在Python中方便地实现? 我看了itertools.compress,但我想不出办法 把它用于我的目的。

3 个答案:

答案 0 :(得分: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)]

从那里,迭代该列表并过滤掉角色为破折号的所有对,这是相对简单的。

答案 1 :(得分: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]

答案 2 :(得分: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]