加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – N选择列表的N / 2个子列表

发布时间:2020-12-20 12:10:11 所属栏目:Python 来源:网络整理
导读:在 Python中是否有一种有效的方法可以将大小为n的列表的所有分区分成两个大小为n / 2的子集?我想得到一些迭代构造,使得每次迭代提供原始列表的两个非重叠子集,每个子??集具有大小n / 2. 例如: A = [1,2,3,4,5,6] # here n = 6# some iterative construct #
在 Python中是否有一种有效的方法可以将大小为n的列表的所有分区分成两个大小为n / 2的子集?我想得到一些迭代构造,使得每次迭代提供原始列表的两个非重叠子集,每个子??集具有大小n / 2.

例如:

A = [1,2,3,4,5,6]    # here n = 6
# some iterative construct
    # in each iteration,a pair of subsets of size n/2
    # subsets = [[1,4],[2,6]] for example for one of the iterations
    # subsets = [[1,5],[3,6]] a different iteration example

子集应该是非重叠的,例如,[[1,3],[4,6]]有效,但[[1,5]]不是.两个子集的顺序无关紧要,6]]不算与[[4,6],[1,3]]不同,因此这两个中只有一个应出现在迭代.每个子集内的顺序也无关紧要,6]],2],[[3]所有计数都相同,所以只有其中一个应该在整个迭代中出现.

解决方法

这是一个基于itertools的生成器,我认为它可以产生你想要的值.

def sub_lists(sequence):
    all_but_first = set(sequence[1:])
    for item in itertools.combinations(sequence[1:],len(sequence)//2 - 1):
        yield [[sequence[0]] + list(item),list(all_but_first.difference(item))]

与Suever的答案中的基于排列的方法相比,我以两种方式避免了几乎重复的输出.首先,我避免同时产生[[“a”,“b”],[“c”,“d”]]和[[“c”,“d”],[“a”,“b”]]强制所有结果在第一个子列表中具有输入序列的第一个值.我通过构建第二个避免产生[[“a”,“d”]和[[“a”,[“d”,“c”]]使用set-subtraction的子列表.

请注意,产生嵌套元组可能比嵌套列表更自然.要做到这一点,只需将最后一行更改为:

yield (sequence[0],) + item,tuple(all_but_first.difference(item))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读