【发布时间】:2018-02-03 13:37:26
【问题描述】:
问题
假设您有n 整数列表,其中每个列表仅包含从1 到n 范围内的整数。例如,对于n = 4,我们可能有:
a_1 = [1, 2]
a_2 = [3]
a_3 = [4, 1, 1]
a_4 = [2, 3]
现在我的问题是:我可以勾选那些n 列表中1 和n 之间的所有整数,但是一旦我找到一个数字,我可以'不再使用该列表来查找后续数字?
例如,在上面n = 4的例子中,我可以从a_1中选择1,从a_4中选择2,从a_2中选择3,对于a_3,我可以选择4,因此我已经填写了所有从 1 到 4 的数字,但每个列表只使用一次。
我找不到范围(因此应该返回 False)的示例是:
a_1 = [1, 2]
a_2 = [3, 3, 5]
a_3 = [4]
a_4 = [5]
a_5 = [3, 4, 5]
原因是因为如果我从 a_1 中选择 1,我不能再从任何列表中选择 2。
方法
这是我目前的直截了当的方法。我制作列表的笛卡尔积并检查是否有任何排序后的范围。
import itertools
def fillRange(lists):
cartesian = itertools.product(*lists)
return any([sorted(comb) == range(1, len(lists) + 1) for comb in cartesian])
问题
虽然我的方法有效,但对于大型列表,它变得有点低效。关于如何改进此算法的任何想法?
谢谢!
【问题讨论】:
-
好的,那么你想要的输入
lists = [a_1, a_2, a_3, a_4]的输出到底是什么? -
从
return any([sorted(comb) == range(1, len(lss) + 1) for comb in cartesian])中删除[]s 会更好吗?就目前而言,您将始终首先处理完整的笛卡尔积,评估条件以构建布尔列表,然后将该列表传递给any以查看是否有任何为真。如果去掉[]s,那么any会在找到第一个匹配条件时返回True。 -
@Chris_Rands 我想要的输出是一个布尔值,指示是否可以使用这些列表找到范围。
-
@McGuire 例如
True? -
@Chris_Rands 查看我更新的编辑,有很多示例无法实现从 1 到 n 的范围。
标签: python algorithm optimization cartesian-product