在Python中从排列中删除组合

2024-06-10 18:28:05 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

想象有3个水果和3个农民。1号水果是苹果,2号是另一个苹果,3号是芒果。它是哪种水果的信息在对象1中。例如,水果=苹果。我已经有一个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


Tags: no代码苹果number数量actionlistjust
1条回答
网友
1楼 · 发布于 2024-06-10 18:28:05

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

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]

相关问题 更多 >