我需要编写一个生成器,该生成器返回物品的每种排列方式,以使每种物品都装在两个不同的袋子中,或者不在两个袋子中。每个组合都应以两个列表的元组形式给出,第一个是bag1中的项目,第二个是bag2中的项目。
我编写了以下代码,但该代码未能通过一个测试用例。它说我的实现比正确答案有更多安排。第二个测试用例通过。我看不到测试用例正在使用哪些项目,但是我尝试了一些值,它似乎可以工作。有人可以给我解释一下怎么了吗?
我基本上正在做的是删除数组中的第一项,并与其余部分递归地调用该函数。然后,我为递归返回的每个安排生成了所有可能的安排,并删除了先前删除的项目(不添加,仅将其添加到第一个袋子,仅将其添加到第二个袋子)。
def yieldAllCombos(items):
"""
Generates all combinations of N items into two bags, whereby each
item is in one or zero bags.
Yields a tuple, (bag1, bag2), where each bag is represented as a list
of which item(s) are in each bag.
"""
# Your code here
if (items == []):
yield ([], [])
else:
item = items[0]
for result in yieldAllCombos(items[1:]):
yield (result[0], result[1])
yield (result[0] + [item], result[1])
yield (result[0], result[1] + [item])
答案 0 :(得分:0)
如@blhsing所建议的那样,使该项目成为列表中的第一个元素即可解决问题。
import matplotlib.pyplot as plt
import numpy as np
center = [5, 3]
L = np.array([-10, 10])
fig, ax = plt.subplots()
ax.set_aspect(1)
for a in range(0, 180, 20):
phi = np.deg2rad(a)
x = center[0] + np.cos(phi) * L
y = center[1] + np.sin(phi) * L
ax.plot(x, y)