kashiff007
kashiff007

Reputation: 386

Print data between positions within a loop

I have one files. File1 which has 3 columns. Data are tab separated

File1:

2  4  Apple
6  7  Samsung

Let's say if I run a loop of 10 iteration. If the iteration has value between column 1 and column 2 of File1, then print the corresponding 3rd column from File1, else print "0".

The columns may or may not be sorted, but 2nd column is always greater than 1st. Range of values in the two columns do not overlap between lines.

The output Result should look like this.

Result:

0
Apple
Apple
Apple
0
Samsung
Samsung
0
0
0

My program in python is here:

chr5_1 = [[]]
for line in file:
  line = line.rstrip()
  line = line.split("\t")
  chr5_1.append([line[0],line[1],line[2]])
  # Here I store all position information in chr5_1 list in list
chr5_1.pop(0)
for i in range (1,10):
  for listo in chr5_1:            
      L1 = " ".join(str(x) for x in listo[:1])
      L2 = " ".join(str(x) for x in listo[1:2])
      L3 = " ".join(str(x) for x in listo[2:3])
      if int(L1) <= i and int(L2) >= i:
          print(L3)
          break
      else:
          print ("0")
          break

I am confused with loop iteration and it break point.

Upvotes: 1

Views: 75

Answers (3)

wwii
wwii

Reputation: 23773

Setup:

import io
s = '''2  4  Apple
6  7  Samsung'''

# Python 2.x
f = io.BytesIO(s)
# Python 3.x
#f = io.StringIO(s)

If the lines of the file are not sorted by the first column:

import csv, operator
reader = csv.reader(f, delimiter = ' ', skipinitialspace = True)
f = list(reader)
f.sort(key = operator.itemgetter(0))

Read each line; do some math to figure out what to print and how many of them to print; print stuff; iterate

def print_stuff(thing, n):
    while n > 0:
        print(thing)
        n -= 1
limit = 10
prev_end = 1

for line in f:
    # if iterating over a file, separate the columns
    begin, end, text = line.strip().split()
    # if iterating over the sorted list of lines
    #begin, end, text = line

    begin, end = map(int, (begin, end))
    # don't exceed the limit
    begin = begin if begin < limit else limit
    # how many zeros?
    gap = begin - prev_end
    print_stuff('0', gap)
    if begin == limit:
        break
    # don't exceed the limit
    end = end if end < limit else limit
    # how many words?
    span = (end - begin) + 1
    print_stuff(text, span)
    if end == limit:
        break
    prev_end = end
# any more zeros?
gap = limit - prev_end
print_stuff('0', gap)

Upvotes: 0

Jared
Jared

Reputation: 567

I think this is a job for else:

position_information = []
with open('file1', 'rb') as f:
    for line in f:
        position_information.append(line.strip().split('\t'))

for i in range(1, 11):
    for start, through, value in position_information:
        if i >= int(start) and i <= int(through):
            print value
            # No need to continue searching for something to print on this line
            break
    else:
        # We never found anything to print on this line, so print 0 instead
        print 0

This gives the result you're looking for:

0
Apple
Apple
Apple
0
Samsung
Samsung
0
0
0

Upvotes: 1

SatanDmytro
SatanDmytro

Reputation: 537

Try this:

chr5_1 = dict()
for line in file:
    line = line.rstrip()
    _from, _to, value = line.split("\t")
    for i in range(int(_from), int(_to) + 1):
        chr5_1[i] = value

for i in range (1, 10):
    print chr5_1.get(i, "0")

Upvotes: 2

Related Questions