首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找两组相同列表的所有唯一组合?

问查找两组相同列表的所有唯一组合?
EN

Stack Overflow用户
提问于 2021-04-30 10:31:05
回答 4查看 78关注 0票数 2

我有两组相同的列表和另一组列表,我试图找到它们的所有唯一组合。我很难弄清楚如何在不重复同一行(例如:培根、培根)的情况下获得这些组合。

我的列表:

代码语言:javascript
复制
crust = ['Thin Crust', 'Hand Tossed']
topping1 = ['Bacon', 'Pepperoni', 'Steak']
topping2 = ['Bacon', 'Pepperoni', 'Steak']
sauce1 = ['Tomato', 'BBQ', 'Ranch']
sauce2 = ['Tomato', 'BBQ', 'Ranch']

我正在尝试获得一个按以下顺序列出所有唯一组合的输出:Sauce|Topping 1|Topping 2|Sauce 1|Sauce 2 Ex:

代码语言:javascript
复制
Thin Crust, Bacon, Pepperoni, Tomato, BBQ
Thin Crust, Bacon, Pepperoni, Tomato, Ranch
Thin Crust, Bacon, Pepperoni, BBQ, Ranch
....

尝试:

代码语言:javascript
复制
import itertools

crust = ['Thin Crust', 'Hand Tossed']
topping1 = ['Bacon', 'Pepperoni', 'Steak']
topping2 = ['Bacon', 'Pepperoni', 'Steak']
sauce1 = ['Tomato', 'BBQ', 'Ranch']
sauce2 = ['Tomato', 'BBQ', 'Ranch']

test = list(itertools.product(crust,topping1,topping2,sauce1,sauce2))
print(test)

我的第一个想法是使用itertools来解决这个问题,但是我不知道如何在上面提到的同一行中防止重复。有没有关于如何做这件事的想法?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-04-30 10:59:53

如果我理解正确的话,你真正要找的是每种配料和酱料的两种组合,然后是他们的产品和crust。如果是这样的话,您不需要相同的列表。

代码语言:javascript
复制
from itertools import combinations, product

crust = ['Thin Crust', 'Hand Tossed']
topping = ['Bacon', 'Pepperoni', 'Steak']
sauce = ['Tomato', 'BBQ', 'Ranch']

topping_combs = combinations(topping, r=2)
sauce_combs = combinations(sauce, r=2)

# >> FOR DEMO
topping_combs = list(topping_combs)
sauce_combs = list(sauce_combs)
print(topping_combs)
print(sauce_combs)
print()
# << FOR DEMO

prod = product(crust, topping_combs, sauce_combs)
for c, t, s in prod:
    print(c, *t, *s, sep=', ')

输出:

代码语言:javascript
复制
[('Bacon', 'Pepperoni'), ('Bacon', 'Steak'), ('Pepperoni', 'Steak')]
[('Tomato', 'BBQ'), ('Tomato', 'Ranch'), ('BBQ', 'Ranch')]

Thin Crust, Bacon, Pepperoni, Tomato, BBQ
Thin Crust, Bacon, Pepperoni, Tomato, Ranch
Thin Crust, Bacon, Pepperoni, BBQ, Ranch
Thin Crust, Bacon, Steak, Tomato, BBQ
Thin Crust, Bacon, Steak, Tomato, Ranch
Thin Crust, Bacon, Steak, BBQ, Ranch
Thin Crust, Pepperoni, Steak, Tomato, BBQ
Thin Crust, Pepperoni, Steak, Tomato, Ranch
Thin Crust, Pepperoni, Steak, BBQ, Ranch
Hand Tossed, Bacon, Pepperoni, Tomato, BBQ
Hand Tossed, Bacon, Pepperoni, Tomato, Ranch
Hand Tossed, Bacon, Pepperoni, BBQ, Ranch
Hand Tossed, Bacon, Steak, Tomato, BBQ
Hand Tossed, Bacon, Steak, Tomato, Ranch
Hand Tossed, Bacon, Steak, BBQ, Ranch
Hand Tossed, Pepperoni, Steak, Tomato, BBQ
Hand Tossed, Pepperoni, Steak, Tomato, Ranch
Hand Tossed, Pepperoni, Steak, BBQ, Ranch
票数 4
EN

Stack Overflow用户

发布于 2021-04-30 10:33:39

您可以使用递归生成器函数:

代码语言:javascript
复制
def combos(d, c = []):
  if not d:
     yield c
  else:
     for i in filter(lambda x:x not in c, d[0]):
        yield from combos(d[1:], c+[i])

print(list(combos([crust,topping1,topping2,sauce1,sauce2])))

输出:

代码语言:javascript
复制
[['Thin Crust', 'Bacon', 'Pepperoni', 'Tomato', 'BBQ'], ['Thin Crust', 'Bacon', 'Pepperoni', 'Tomato', 'Ranch'], ['Thin Crust', 'Bacon', 'Pepperoni', 'BBQ', 'Tomato'], ['Thin Crust', 'Bacon', 'Pepperoni', 'BBQ', 'Ranch'], ['Thin Crust', 'Bacon', 'Pepperoni', 'Ranch', 'Tomato'], ['Thin Crust', 'Bacon', 'Pepperoni', 'Ranch', 'BBQ'], ['Thin Crust', 'Bacon', 'Steak', 'Tomato', 'BBQ'], ['Thin Crust', 'Bacon', 'Steak', 'Tomato', 'Ranch'], ['Thin Crust', 'Bacon', 'Steak', 'BBQ', 'Tomato'], ['Thin Crust', 'Bacon', 'Steak', 'BBQ', 'Ranch'], ['Thin Crust', 'Bacon', 'Steak', 'Ranch', 'Tomato'], ['Thin Crust', 'Bacon', 'Steak', 'Ranch', 'BBQ'], ['Thin Crust', 'Pepperoni', 'Bacon', 'Tomato', 'BBQ'], ['Thin Crust', 'Pepperoni', 'Bacon', 'Tomato', 'Ranch'], ['Thin Crust', 'Pepperoni', 'Bacon', 'BBQ', 'Tomato'], ['Thin Crust', 'Pepperoni', 'Bacon', 'BBQ', 'Ranch'], ['Thin Crust', 'Pepperoni', 'Bacon', 'Ranch', 'Tomato'], ['Thin Crust', 'Pepperoni', 'Bacon', 'Ranch', 'BBQ'], ['Thin Crust', 'Pepperoni', 'Steak', 'Tomato', 'BBQ'], ['Thin Crust', 'Pepperoni', 'Steak', 'Tomato', 'Ranch'], ['Thin Crust', 'Pepperoni', 'Steak', 'BBQ', 'Tomato'], ['Thin Crust', 'Pepperoni', 'Steak', 'BBQ', 'Ranch'], ['Thin Crust', 'Pepperoni', 'Steak', 'Ranch', 'Tomato'], ['Thin Crust', 'Pepperoni', 'Steak', 'Ranch', 'BBQ'], ['Thin Crust', 'Steak', 'Bacon', 'Tomato', 'BBQ'], ['Thin Crust', 'Steak', 'Bacon', 'Tomato', 'Ranch'], ['Thin Crust', 'Steak', 'Bacon', 'BBQ', 'Tomato'], ['Thin Crust', 'Steak', 'Bacon', 'BBQ', 'Ranch'], ['Thin Crust', 'Steak', 'Bacon', 'Ranch', 'Tomato'], ['Thin Crust', 'Steak', 'Bacon', 'Ranch', 'BBQ'], ['Thin Crust', 'Steak', 'Pepperoni', 'Tomato', 'BBQ'], ['Thin Crust', 'Steak', 'Pepperoni', 'Tomato', 'Ranch'], ['Thin Crust', 'Steak', 'Pepperoni', 'BBQ', 'Tomato'], ['Thin Crust', 'Steak', 'Pepperoni', 'BBQ', 'Ranch'], ['Thin Crust', 'Steak', 'Pepperoni', 'Ranch', 'Tomato'], ['Thin Crust', 'Steak', 'Pepperoni', 'Ranch', 'BBQ'], ['Hand Tossed', 'Bacon', 'Pepperoni', 'Tomato', 'BBQ'], ['Hand Tossed', 'Bacon', 'Pepperoni', 'Tomato', 'Ranch'], ['Hand Tossed', 'Bacon', 'Pepperoni', 'BBQ', 'Tomato'], ['Hand Tossed', 'Bacon', 'Pepperoni', 'BBQ', 'Ranch'], ['Hand Tossed', 'Bacon', 'Pepperoni', 'Ranch', 'Tomato'], ['Hand Tossed', 'Bacon', 'Pepperoni', 'Ranch', 'BBQ'], ['Hand Tossed', 'Bacon', 'Steak', 'Tomato', 'BBQ'], ['Hand Tossed', 'Bacon', 'Steak', 'Tomato', 'Ranch'], ['Hand Tossed', 'Bacon', 'Steak', 'BBQ', 'Tomato'], ['Hand Tossed', 'Bacon', 'Steak', 'BBQ', 'Ranch'], ['Hand Tossed', 'Bacon', 'Steak', 'Ranch', 'Tomato'], ['Hand Tossed', 'Bacon', 'Steak', 'Ranch', 'BBQ'], ['Hand Tossed', 'Pepperoni', 'Bacon', 'Tomato', 'BBQ'], ['Hand Tossed', 'Pepperoni', 'Bacon', 'Tomato', 'Ranch'], ['Hand Tossed', 'Pepperoni', 'Bacon', 'BBQ', 'Tomato'], ['Hand Tossed', 'Pepperoni', 'Bacon', 'BBQ', 'Ranch'], ['Hand Tossed', 'Pepperoni', 'Bacon', 'Ranch', 'Tomato'], ['Hand Tossed', 'Pepperoni', 'Bacon', 'Ranch', 'BBQ'], ['Hand Tossed', 'Pepperoni', 'Steak', 'Tomato', 'BBQ'], ['Hand Tossed', 'Pepperoni', 'Steak', 'Tomato', 'Ranch'], ['Hand Tossed', 'Pepperoni', 'Steak', 'BBQ', 'Tomato'], ['Hand Tossed', 'Pepperoni', 'Steak', 'BBQ', 'Ranch'], ['Hand Tossed', 'Pepperoni', 'Steak', 'Ranch', 'Tomato'], ['Hand Tossed', 'Pepperoni', 'Steak', 'Ranch', 'BBQ'], ['Hand Tossed', 'Steak', 'Bacon', 'Tomato', 'BBQ'], ['Hand Tossed', 'Steak', 'Bacon', 'Tomato', 'Ranch'], ['Hand Tossed', 'Steak', 'Bacon', 'BBQ', 'Tomato'], ['Hand Tossed', 'Steak', 'Bacon', 'BBQ', 'Ranch'], ['Hand Tossed', 'Steak', 'Bacon', 'Ranch', 'Tomato'], ['Hand Tossed', 'Steak', 'Bacon', 'Ranch', 'BBQ'], ['Hand Tossed', 'Steak', 'Pepperoni', 'Tomato', 'BBQ'], ['Hand Tossed', 'Steak', 'Pepperoni', 'Tomato', 'Ranch'], ['Hand Tossed', 'Steak', 'Pepperoni', 'BBQ', 'Tomato'], ['Hand Tossed', 'Steak', 'Pepperoni', 'BBQ', 'Ranch'], ['Hand Tossed', 'Steak', 'Pepperoni', 'Ranch', 'Tomato'], ['Hand Tossed', 'Steak', 'Pepperoni', 'Ranch', 'BBQ']]

您还可以使用itertools.product预先生成所有组合,然后使用重复值过滤结果:

代码语言:javascript
复制
import itertools as it
r = [i for i in it.product(crust,topping1,topping2,sauce1,sauce2) if len(i) == len(set(i))]
票数 2
EN

Stack Overflow用户

发布于 2021-04-30 11:29:17

已经有使用itertools模块的解决方案,所以这里有一个从头构建的解决方案:

代码语言:javascript
复制
crust = ['Thin Crust', 'Hand Tossed']
topping1 = ['Bacon', 'Pepperoni', 'Steak']
topping2 = ['Bacon', 'Pepperoni', 'Steak']
sauce1 = ['Tomato', 'BBQ', 'Ranch']
sauce2 = ['Tomato', 'BBQ', 'Ranch']

def create_uniques(options, creation_so_far):
    # options is a list of lists
    # creation_so_far is a set of options we've picked
    uniques = set()
    def recurse(options, creation_so_far):
        if not options:
            # we've gone through every list of options we have
            # e.g. we've gone through
            # crust, topping1, topping2, sauce1, sauce2
            # so we add this to our set of uniques
            uniques.add(tuple(sorted(creation_so_far)))
            return
        current_option = options[0] # we pick the current option
        for choice in current_option:
            # make sure the choice we're adding isn't already in our creation_so_far
            if choice not in creation_so_far:
                creation_so_far.add(choice)
                recurse(options[1:], creation_so_far)
                creation_so_far.remove(choice)
    recurse(options, creation_so_far)
    return uniques

uniques = create_uniques([crust,topping1,topping2,sauce1,sauce2], set())

for unique in uniques:
    print(unique)
                                                                                 ```
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67327461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档