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