我在写一个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
我试过类似的东西,但这是错的。非常感谢任何帮助。
答案 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
>>>