Electric
Electric

Reputation: 537

printing items in a list represented by bit list

I have this problem on writing a python function which takes a bit list as input and prints the items represented by this bit list.

so the question is on Knapsack and it is a relatively simple and straightforward one as I'm new to the python language too.

so technically the items can be named in a list [1,2,3,4] which corresponds to Type 1, Type 2, Type 3 and etc but we won't be needing the "type". the problem is, i represented the solution in a bit list [0,1,1,1] where 0 means not taken and 1 means taken. in another words, item of type 1 is not taken but the rest are taken, as represented in the bit list i wrote.

now we are required to write a python function which takes the bit list as input and prints the item corresponding to it in which in this case i need the function to print out [2,3,4] leaving out the 1 since it is 0 by bit list. any help on this? it is a 2 mark question but i still couldn't figure it out.

def printItems(l):
for x in range(len(l)):
    if x == 0:
        return False
    elif x == 1:
        return l

i tried something like that but it is wrong. much appreciated for any help.

Upvotes: 1

Views: 54

Answers (3)

Moinuddin Quadri
Moinuddin Quadri

Reputation: 48092

You may do it using list comprehension with enumerate() as:

>>> my_list = [0, 1, 1, 1]
>>> taken_list = [i for i, item in enumerate(my_list, 1) if item]
>>> taken_list             # by default start with 0  ^
[2, 3, 4]

Alternatively, in case you do not need any in-built function and want to create your own function, you may modify your code as:

def printItems(l):
    new_list = []
    for x in range(len(l)):
        if l[x] == 1:
            new_list.append(x+1) # "x+1" because index starts with `0` and you need position
    return new_list

Sample run:

>>> printItems([0, 1, 1, 1])
[2, 3, 4]

Upvotes: 0

Ben
Ben

Reputation: 6767

You can do this with the zip function that takes two tiers Lee and returns them in pairs:

for bit_item, item in zip(bit_list, item_list):
    if bit_item:
        print item

Or if you need a list rather than printing them, you can use a list comprehension:

[item for bit_item, item in zip(bit_list, item_list) if bit_item]

Upvotes: 1

juanpa.arrivillaga
juanpa.arrivillaga

Reputation: 95993

You can use itertools.compress for a quick solution:

>>> import itertools
>>> list(itertools.compress(itertools.count(1), [0, 1, 1, 1]))
[2, 3, 4]

The reason your solution doesn't work is because you are using return in your function, where you need to use print, and make sure you are iterating over your list correctly. In this case, enumerate simplifies things, but there are many similar approaches that would work:

>>> def print_items(l):
...     for i,b in enumerate(l,1):
...         if b:
...             print(i)
... 
>>> print_items([0,1,1,1])
2
3
4
>>> 

Upvotes: 0

Related Questions