首页 > 解决方案 > 从 Python 中的排列中删除组合

问题描述

我列出了可用水果数量和农民数量之间的排列。在排列中,它输入(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

解决方案


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

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]

推荐阅读