【问题标题】:Remove combinations from permutations in Python从 Python 中的排列中删除组合
【发布时间】:2020-11-09 18:43:19
【问题描述】:

我列出了可用水果数量和农民数量之间的排列。在排列中,它输入(1,2,..,max_number of fruits)和农民数量(3)。这是我使用的代码:

action_list = list(permutations(no_fruits(list), no_farmers(just a number)))

假设有 3 个水果是 3 个农民。 1 号水果是苹果,2 号是另一个苹果,3 号是芒果。例如,对象 1.fruit= apple 中包含的水果信息。我已经有一个 lis 说明哪些数字具有相同的水果。我们有这 6 种组合: (1,2,3) (1,3,2) (2,1,3) (2,3,1) (3,1,2) (3,2,1)

但现在我不想区分苹果 1 和苹果 2。所以最终输出应该是: (1,2,3) (1,3,2) (3,1,2)

如何删除其他组合?换句话说,我怎样才能删除 只有 1 号水果和 2 号水果互换位置的组合?

其他相关信息: 农民的数量可能优于可用水果的数量。在那种情况下,会有一些农民没有水果,会被表示为“-”。这是一个例子:

(1,2,-)

这意味着农夫 3 没有水果,而农夫 1 和农夫 2 分别有水果 1 和 2。

【问题讨论】:

    标签: python


    【解决方案1】:

    我还没有完全掌握。然而,这里有一个更新的代码来处理水果和农民之间的不匹配,但需要两个迭代:

    def customZip(*obj):
        while any(obj):
            yield ([i.pop(0) if i else '-' for i in obj])
    
    def permutation(fruits, farmers):
        populate = []
        for i in customZip(fruits, farmers):
            populate.append(i)
    
        def _permutation(obj, _len):
            if len(obj) == 1:
                yield obj
            else:
                l = []
                for i in range(len(obj)):
                    for j in _permutation(obj[:i] + obj[i+1:], _len):
                        alt = obj[i:i+1] + j
                        if len(alt) != _len:
                            yield alt
                        else:
                            res = [i[0] for i in alt]
                            if res not in l:
                                l.append(res)
                                yield ([i[1] for i in alt], res)
    
        for j in _permutation(populate, len(populate)):
            yield j
    
    for i in permutation(fruits, farmers):
        print(i)
    
    #1
    farmers = [1, 2, 3]
    fruits = ['apple', 'apple', 'melon']
    
    ([1, 2, 3], ['apple', 'apple', 'melon'])
    ([1, 3, 2], ['apple', 'melon', 'apple'])
    ([3, 1, 2], ['melon', 'apple', 'apple'])
    [Finished in 0.2s]
    
    #2
    farmers = [1, 2, 3]
    fruits = ['apple', 'melon']
    
    ([1, 2, 3], ['apple', 'melon', '-'])
    ([1, 3, 2], ['apple', '-', 'melon'])
    ([2, 1, 3], ['melon', 'apple', '-'])
    ([2, 3, 1], ['melon', '-', 'apple'])
    ([3, 1, 2], ['-', 'apple', 'melon'])
    ([3, 2, 1], ['-', 'melon', 'apple'])
    [Finished in 0.2s]
    

    【讨论】:

    • 这有帮助,但不想写“apple”、“melon”,因为我事先不认识它们。例如,在 [3,2,1] 中,3 是给农民 1 的水果,给农民 2 的水果 2 和给农民 3 的水果 1。所以一种可能的输入是食物的数量与农民的数量不同。因此,在排列 len(nm) 中,我实际上想要 len(农民数量),而 nm 将是可用水果的数量。也就是说,这不适用于有更多农民感谢水果的情况
    • 此类信息应添加到主要问题中,如果是后者,应如何将水果分发给农民?请也添加它以及可能的其他关键信息,以使您的问题更清楚。
    • 感谢您的意见。我加一下
    • 对不起,我不是很清楚,但里面我不想要水果的描述。那将是数字之间的比较术语。就像如果 1.fruit==1.fruit 那么它们是相同的。所以置换函数的输入是:[1,2,3,4, (...)],numberof farmers
    猜你喜欢
    • 1970-01-01
    • 2018-01-10
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多