Home > Blockchain >  Mark positions of a string in a list
Mark positions of a string in a list

Time:01-04

I have two lists,

one holds nucleotide values

nucleotides = ['A', 'G', 'C', 'T', 'A', 'G', 'G', 'A', 'G', 'C']

second one holds true(1) or false(0) values for every letter to indicate that they are covered or not.

flag_map = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

initially second one have all false values.

Let's say I want to map every "AGC" values in the array.

So my second list should be like this:

flag_map = [1, 1, 1, 0, 0, 0, 0, 1, 1, 1]

What is the best method that I can use here?

CodePudding user response:

You could join your original list of characters into a single string, and then replace instances of 'AGC' by 111. Then iterate over each character in this string, and if it's '1', we want a 1 in our result, else we want 0.

I changed your variable name because str is a built-in.

nucleotides = ['A', 'G', 'C', 'T', 'A', 'G', 'G', 'A', 'G', 'C']

flag_map = [int(char == '1') 
          for char in "".join(nucleotides).replace('AGC', '111')]

Which gives the desired result:

[1, 1, 1, 0, 0, 0, 0, 1, 1, 1]

The char == '1' checks if the character is '1', and int(...) converts the boolean True to 1 and False to 0. If you are fine with booleans (for most applications I can see, you should be perfectly fine using bool instead of int) then you can skip the conversion to int and simply have char == '1'.

Try it online

CodePudding user response:

You can use a list comprehension like so:

l = ['A','G','C','T','A','G','G','A','G','C']
s = "AGC"
res = [ (c in s and l[i - (j := s.index(c)) : i   len(s) - j] == [*s]) 
          for i, c in enumerate(l)]
  • Related