如何在Python中将列表拆分为没有重复元素的子集
我需要的代码接受一个列表(最多 n=31
)并返回 n=3
的所有可能子集,而没有任何两个元素在同一子集中重复两次(想想每次都与新人以 3 人为一组组队的人):
list=[1,2,3,4,5,6,7,8,9]
并且返回
[1,2,3][4,5,6][7,8,9]
[1,4,7][2,3,8][3,6,9]
[1,6,8][2,4,9][3,5,7]
但没有:
[1,5,7][2,4,8][3,6,9]
因为 1 和 7 已经一起出现(同样,3 和 9)。
我还想对 n=2
的子集执行此操作。 谢谢你!!
I need code that takes a list (up to n=31
) and returns all possible subsets of n=3
without any two elements repeating in the same subset twice (think of people who are teaming up in groups of 3 with new people every time):
list=[1,2,3,4,5,6,7,8,9]
and returns
[1,2,3][4,5,6][7,8,9]
[1,4,7][2,3,8][3,6,9]
[1,6,8][2,4,9][3,5,7]
but not:
[1,5,7][2,4,8][3,6,9]
because 1 and 7 have appeared together already (likewise, 3 and 9).
I would also like to do this for subsets of n=2
.
Thank you!!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这是我想出的:
这打印:
Here's what I came up with:
This prints:
试试这个:
n = 10 的输出:
http://pastebin.com/Vm54HRq3
Try this:
Output for n = 10:
http://pastebin.com/Vm54HRq3
这是我对您的问题的一个相当通用的解决方案的尝试。
然而,对于
n
的高值来说它非常慢,对于n=31
来说太慢了。我现在没有时间尝试提高速度,但我稍后可能会尝试。欢迎提出建议!Here's my attempt of a fairly general solution to your problem.
However, it is very slow for high values of
n
, too slow forn=31
. I don't have time right now to try to improve the speed, but I might try later. Suggestions are welcome!我的妻子在尝试为九人会议安排分组时遇到了这个问题;她不希望任何参加者重复参加。
我立即拿出了 itertools,然后被难住了,然后来到了 StackOverflow。但与此同时,我的非程序员妻子直观地解决了这个问题。关键的见解是创建一个井字游戏网格:
然后简单地采取 3 组向下,3 组横向,3 组对角线环绕,3 组对角线相反,环绕。
那么你就可以在脑海中做到这一点。
我想下一个问题是这样的视觉方法你能走多远?它是否依赖于所需子集大小 * 子集数量 = 总元素数量的巧合?
My wife had this problem trying to arrange breakout groups for a meeting with nine people; she wanted no pairs of attendees to repeat.
I immediately busted out itertools and was stumped and came to StackOverflow. But in the meantime, my non-programmer wife solved it visually. The key insight is to create a tic-tac-toe grid:
And then simply take 3 groups going down, 3 groups going across, and 3 groups going diagonally wrapping around, and 3 groups going diagonally the other way, wrapping around.
You can do it just in your head then.
I suppose the next question is how far can you take a visual method like this? Does it rely on the coincidence that the desired subset size * the number of subsets = the number of total elements?