biogeek - 28 days ago 6
Python Question

# How to handle index of out range and invalid syntax for a sample with binary values in a list of lists in Pytjon?

The following is my sample that consists of binary values 0 and 1

`````` sample = [['0100','0101','0101''],['011','100','001','001'],['001','001','001']]
``````

For any number of elements in the list and any number of elements in the list of lists I need to do the following:

A. Convert it into a list of lists such that the corresponding elements of each list are strung together in a list of lists

``````column = [['000','111','000','0111'],['0100','1000','1011'],['000','000','111']
``````

B. Create a counter(nn) to count length of each element and divide by (nn-1)

``````nn = [[3,3,3,3],[4,4,4],[3,3,3]]
nn - 1 = [[2,2,2,2],[3,3,3,3],[2,2,2]]
d = nn-1
div = nn/d
``````

C. Need to calculate a parameter for pi. Here is a link showing how this can be done for a list https://eval.in/672980.

I have tried to write the code for the same. I hit the following errors:

`````` A. l += seq_list[j][i]
IndexError: list index out of range.
``````

I am certain that i,j and k are all in the correct range.

``````B. counters = [Counter(sub_list) for sub_list in column]
^
SyntaxError: invalid syntax
``````

Why is it invalid syntax?

Any ideas on how to correct the errors? I tried different ways to do the same, but I am unable to do so.

``````#Tranposing. Moving along the columns only
column = []
for k in range(len(seq_list)):
for i in range(len(seq_list[k][0])):   #Length of the row
l = ""
for j in range(len(seq_list[k])): #Length of the column
l += seq_list[j][i]
column.append(l)
print "\n Making the columns as a list: " + str(column)

#Creating a separate list where -/? will not be part of the sequence
tt = ["".join(y for y in x if y in {'0','1'}) for x in column]

#Creating a counter that stores n/n-1 values
counters = [Counter(sub_list) for sub_list in tt]
nn =[]
d = []
for counter in counters:
binary_count = sum((val for key, val in counter.items() if key in "01"))
nn.append(binary_count)
d = [i - 1 for i in nn]
div = [int(b) / int(m) for b,m in zip(nn, d)]
``````

I think this should work for you:

``````seq_list = [['0100','0101','0101'],['011','100','001','001'],['001','001','001']]

results = []
for k in range(len(seq_list)):
column_list = [[] for i in range(len(seq_list[k][0]))]
for seq in seq_list[k]:
for i, nuc in enumerate(seq):
column_list[i].append(nuc)
tt = ["".join(y for y in x if y in {'0','1'}) for x in column_list]
results.append(tt)

### Creating a counter that stores n/n-1 values
BINARY = {'0','1'}
counts = [[sum(c in BASES for c in s) for s in pair] for pair in results]
countsminusone1 = [[(sum(c in BINARY for c in s)-1) for s in pair] for pair in results]
countsminusone = [[1 if x <= 0 else x for x in pair] for pair in countsminusone1]
bananasplit = [[n/d for n, d in zip(subq, subr)] for subq, subr in zip(counts, countsminusone)]
``````