打印由位列表表示的列表中的项目

时间:2016-11-03 08:16:13

标签: python list

我在写一个python函数时遇到这个问题,该函数将一个列表作为输入并打印该位列表所代表的项目。

所以问题在于背包,它是一个相对简单和直接的问题,因为我也是python语言的新手。

所以从技术上讲,项目可以在列表[1,2,3,4]中命名,列表对应于类型1,类型2,类型3等,但我们不需要“类型”。问题是,我在位列表[0,1,1,1]中表示了解决方案,其中0表示未采用,1表示采用。换句话说,不采用类型1的项目,而是采取其余的项目,如我写的位列表所示。

现在我们需要编写一个python函数,它将位列表作为输入并打印出与之对应的项目,在这种情况下我需要打印出[2,3,4]的函数,从而省略了1它是0位列表。对此有何帮助?这是一个2分的问题,但我仍然无法弄明白。

In [42]: df
Out[42]:
    Probability  ID
ID
4      0.013925   4
6      0.053906   6
10     0.001792  10

In [43]: df = df.reset_index(drop=True)

In [44]: df
Out[44]:
   Probability  ID
0     0.013925   4
1     0.053906   6
2     0.001792  10
我试过类似的东西,但这是错的。非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

你可以使用带有两层Lee的zip函数并成对返回它们:

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

或者,如果您需要列表而不是打印它们,则可以使用列表解析:

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

答案 1 :(得分:0)

您可以使用列表理解并使用enumerate()执行此操作:

>>> 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]

或者,如果您不需要任何内置函数并且想要创建自己的函数,可以将代码修改为:

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

示例运行:

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

答案 2 :(得分:0)

您可以使用itertools.compress来快速解决问题:

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

您的解决方案无法正常工作的原因是您在函数中使用return,需要使用print,并确保正确迭代列表。在这种情况下,enumerate简化了事情,但有许多类似的方法可行:

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