Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有办法生成项目列表的所有唯一排列_Python_Permutation_Itertools_Zebra Puzzle - Fatal编程技术网

Python 有没有办法生成项目列表的所有唯一排列

Python 有没有办法生成项目列表的所有唯一排列,python,permutation,itertools,zebra-puzzle,Python,Permutation,Itertools,Zebra Puzzle,我有一个五个属性的列表,每个属性有五个不同的值。我想生成它们的笛卡尔积并过滤所有唯一的排列 一些背景: 我需要它们作为我的输入值来解决逻辑难题。在那里,我对照规则找到正确的解决方案 来自itertools导入产品的 #输入 姓名=['Dana','Ingo','Jessica','Sören','Valerie'] 年龄=[26,27,30,33,35] 上衣=[“衬衫”、“马球衫”、“套头衫”、“运动衫”、“T恤”] 颜色=[“蓝色”、“黄色”、“绿色”、“红色”、“黑色”] 尺寸=['XS'

我有一个五个属性的列表,每个属性有五个不同的值。我想生成它们的笛卡尔积并过滤所有唯一的排列

一些背景:

我需要它们作为我的输入值来解决逻辑难题。在那里,我对照规则找到正确的解决方案

来自itertools导入产品的

#输入
姓名=['Dana','Ingo','Jessica','Sören','Valerie']
年龄=[26,27,30,33,35]
上衣=[“衬衫”、“马球衫”、“套头衫”、“运动衫”、“T恤”]
颜色=[“蓝色”、“黄色”、“绿色”、“红色”、“黑色”]
尺寸=['XS'、'S'、'M'、'L'、'XL']
所有属性=[姓名、年龄、上衣、颜色、尺寸]
#笛卡尔积(超集)
输入=列表(产品(*所有属性))
#下面的代码可以让您这样做。。。
也许一个简单的例子可以说明这一点

数据:

['Dana','Ingo',[26,27]]
数据的笛卡尔乘积:

[('Dana',26),('Dana',27),('Ingo',26),('Ingo',27)]
我想要的是:

[('Dana',26),('Ingo',27)],
[('Dana',27),('Ingo',26)],
[('Ingo',26),('Dana',27)],
[('Ingo',27),('Dana',26)]]
我不想要的是:

[('Dana',26),('Ingo',26)]。。。
我不希望同一个值多次出现。位置很重要,因此它应该具有置换字符,对于包含五个元素的列表,它应该具有置换字符。我猜输出大小将非常大,可能无法计算,因此最好指定一些固定的位置值。例如,我想将“Dana”设置为第一个元素名

输出:

[('Dana', 26, 'Hemd', 'blau', 'XS'), ('Ingo', 27, 'Poloshirt', 'gelb', 'S')]
[('Dana', 26, 'Hemd', 'blau', 'S'), ('Ingo', 27, 'Poloshirt', 'gelb', 'XS')]
[('Dana', 26, 'Hemd', 'gelb', 'XS'), ('Ingo', 27, 'Poloshirt', 'blau', 'S')]
[('Dana', 26, 'Hemd', 'gelb', 'S'), ('Ingo', 27, 'Poloshirt', 'blau', 'XS')]
[('Dana', 26, 'Poloshirt', 'blau', 'XS'), ('Ingo', 27, 'Hemd', 'gelb', 'S')]
[('Dana', 26, 'Poloshirt', 'blau', 'S'), ('Ingo', 27, 'Hemd', 'gelb', 'XS')]
[('Dana', 26, 'Poloshirt', 'gelb', 'XS'), ('Ingo', 27, 'Hemd', 'blau', 'S')]
[('Dana', 26, 'Poloshirt', 'gelb', 'S'), ('Ingo', 27, 'Hemd', 'blau', 'XS')]
[('Dana', 27, 'Hemd', 'blau', 'XS'), ('Ingo', 26, 'Poloshirt', 'gelb', 'S')]
[('Dana', 27, 'Hemd', 'blau', 'S'), ('Ingo', 26, 'Poloshirt', 'gelb', 'XS')]
[('Dana', 27, 'Hemd', 'gelb', 'XS'), ('Ingo', 26, 'Poloshirt', 'blau', 'S')]
[('Dana', 27, 'Hemd', 'gelb', 'S'), ('Ingo', 26, 'Poloshirt', 'blau', 'XS')]
[('Dana', 27, 'Poloshirt', 'blau', 'XS'), ('Ingo', 26, 'Hemd', 'gelb', 'S')]
[('Dana', 27, 'Poloshirt', 'blau', 'S'), ('Ingo', 26, 'Hemd', 'gelb', 'XS')]
[('Dana', 27, 'Poloshirt', 'gelb', 'XS'), ('Ingo', 26, 'Hemd', 'blau', 'S')]
[('Dana', 27, 'Poloshirt', 'gelb', 'S'), ('Ingo', 26, 'Hemd', 'blau', 'XS')]
[('Ingo', 26, 'Hemd', 'blau', 'XS'), ('Dana', 27, 'Poloshirt', 'gelb', 'S')]
[('Ingo', 26, 'Hemd', 'blau', 'S'), ('Dana', 27, 'Poloshirt', 'gelb', 'XS')]
[('Ingo', 26, 'Hemd', 'gelb', 'XS'), ('Dana', 27, 'Poloshirt', 'blau', 'S')]
[('Ingo', 26, 'Hemd', 'gelb', 'S'), ('Dana', 27, 'Poloshirt', 'blau', 'XS')]
[('Ingo', 26, 'Poloshirt', 'blau', 'XS'), ('Dana', 27, 'Hemd', 'gelb', 'S')]
[('Ingo', 26, 'Poloshirt', 'blau', 'S'), ('Dana', 27, 'Hemd', 'gelb', 'XS')]
[('Ingo', 26, 'Poloshirt', 'gelb', 'XS'), ('Dana', 27, 'Hemd', 'blau', 'S')]
[('Ingo', 26, 'Poloshirt', 'gelb', 'S'), ('Dana', 27, 'Hemd', 'blau', 'XS')]
[('Ingo', 27, 'Hemd', 'blau', 'XS'), ('Dana', 26, 'Poloshirt', 'gelb', 'S')]
[('Ingo', 27, 'Hemd', 'blau', 'S'), ('Dana', 26, 'Poloshirt', 'gelb', 'XS')]
[('Ingo', 27, 'Hemd', 'gelb', 'XS'), ('Dana', 26, 'Poloshirt', 'blau', 'S')]
[('Ingo', 27, 'Hemd', 'gelb', 'S'), ('Dana', 26, 'Poloshirt', 'blau', 'XS')]
[('Ingo', 27, 'Poloshirt', 'blau', 'XS'), ('Dana', 26, 'Hemd', 'gelb', 'S')]
[('Ingo', 27, 'Poloshirt', 'blau', 'S'), ('Dana', 26, 'Hemd', 'gelb', 'XS')]
[('Ingo', 27, 'Poloshirt', 'gelb', 'XS'), ('Dana', 26, 'Hemd', 'blau', 'S')]
[('Ingo', 27, 'Poloshirt', 'gelb', 'S'), ('Dana', 26, 'Hemd', 'blau', 'XS')]
[[('Dana',26),('Ingo',27),
[('Dana',27),('Ingo',26)]]
出于好奇,也许你可以告诉我,这些概念的具体数学名称是什么,我需要什么


谜题:

有五个朋友(达娜、英戈、杰西卡、瑟伦、瓦莱丽)在购物中心的收银机前排队。他们年龄不同(26、27、30、33、35),想为自己买不同的上衣(衬衫、马球衫、套头衫、运动衫、T恤)。上衣有不同的颜色(蓝色、黄色、绿色、红色、黑色)和尺寸(XS、S、M、L、XL)

规则:
  • “达娜”想要买的上衣是“XL”。她身后(但不是正后方)是一个穿着“黑色”上衣的人
  • “杰西卡”直接在想买“马球衫”的人面前等待
  • 排队的第二个人想买一件“黄色”上衣
  • “T恤”不是“红色”
  • “Sören”想买一件“运动衫”。在他前面等的人比在他后面等的人年龄大
  • “Ingo”需要一件L码上衣
  • 排队的最后一个人是30岁
  • 最年长的人要买最小尺寸的上衣
  • 直接在“瓦莱丽”后面等待的人想买一件“红色”上衣,它比“S”码大
  • 最年轻的人想买一件“黄色”上衣
  • 杰西卡打算买一件“衬衫”
  • 排队的第三个人想买一件M码的上衣
  • “Poloshirt”是“红色”、“黄色”或“绿色”

  • 这样就可以了,但需要很长时间。我减小了列表大小,因为您请求的选项有2488320000个排列:

    from itertools import permutations, product
    
    names = ['Dana', 'Ingo']
    ages = [26, 27]
    tops = ['Hemd', 'Poloshirt']
    colors = ['blau', 'gelb']
    sizes = ['XS', 'S']
    
    options = []
    
    # Generate the Cartesian product of all permutations of the options.
    for name,age,top,color,size in product(*map(permutations,[names,ages,tops,colors,sizes])):
        # Build the option list. zip() transposes the individual lists.
        option = list(zip(name,age,top,color,size))
        options.append(option)
        print(option)
    
    输出:

    [('Dana', 26, 'Hemd', 'blau', 'XS'), ('Ingo', 27, 'Poloshirt', 'gelb', 'S')]
    [('Dana', 26, 'Hemd', 'blau', 'S'), ('Ingo', 27, 'Poloshirt', 'gelb', 'XS')]
    [('Dana', 26, 'Hemd', 'gelb', 'XS'), ('Ingo', 27, 'Poloshirt', 'blau', 'S')]
    [('Dana', 26, 'Hemd', 'gelb', 'S'), ('Ingo', 27, 'Poloshirt', 'blau', 'XS')]
    [('Dana', 26, 'Poloshirt', 'blau', 'XS'), ('Ingo', 27, 'Hemd', 'gelb', 'S')]
    [('Dana', 26, 'Poloshirt', 'blau', 'S'), ('Ingo', 27, 'Hemd', 'gelb', 'XS')]
    [('Dana', 26, 'Poloshirt', 'gelb', 'XS'), ('Ingo', 27, 'Hemd', 'blau', 'S')]
    [('Dana', 26, 'Poloshirt', 'gelb', 'S'), ('Ingo', 27, 'Hemd', 'blau', 'XS')]
    [('Dana', 27, 'Hemd', 'blau', 'XS'), ('Ingo', 26, 'Poloshirt', 'gelb', 'S')]
    [('Dana', 27, 'Hemd', 'blau', 'S'), ('Ingo', 26, 'Poloshirt', 'gelb', 'XS')]
    [('Dana', 27, 'Hemd', 'gelb', 'XS'), ('Ingo', 26, 'Poloshirt', 'blau', 'S')]
    [('Dana', 27, 'Hemd', 'gelb', 'S'), ('Ingo', 26, 'Poloshirt', 'blau', 'XS')]
    [('Dana', 27, 'Poloshirt', 'blau', 'XS'), ('Ingo', 26, 'Hemd', 'gelb', 'S')]
    [('Dana', 27, 'Poloshirt', 'blau', 'S'), ('Ingo', 26, 'Hemd', 'gelb', 'XS')]
    [('Dana', 27, 'Poloshirt', 'gelb', 'XS'), ('Ingo', 26, 'Hemd', 'blau', 'S')]
    [('Dana', 27, 'Poloshirt', 'gelb', 'S'), ('Ingo', 26, 'Hemd', 'blau', 'XS')]
    [('Ingo', 26, 'Hemd', 'blau', 'XS'), ('Dana', 27, 'Poloshirt', 'gelb', 'S')]
    [('Ingo', 26, 'Hemd', 'blau', 'S'), ('Dana', 27, 'Poloshirt', 'gelb', 'XS')]
    [('Ingo', 26, 'Hemd', 'gelb', 'XS'), ('Dana', 27, 'Poloshirt', 'blau', 'S')]
    [('Ingo', 26, 'Hemd', 'gelb', 'S'), ('Dana', 27, 'Poloshirt', 'blau', 'XS')]
    [('Ingo', 26, 'Poloshirt', 'blau', 'XS'), ('Dana', 27, 'Hemd', 'gelb', 'S')]
    [('Ingo', 26, 'Poloshirt', 'blau', 'S'), ('Dana', 27, 'Hemd', 'gelb', 'XS')]
    [('Ingo', 26, 'Poloshirt', 'gelb', 'XS'), ('Dana', 27, 'Hemd', 'blau', 'S')]
    [('Ingo', 26, 'Poloshirt', 'gelb', 'S'), ('Dana', 27, 'Hemd', 'blau', 'XS')]
    [('Ingo', 27, 'Hemd', 'blau', 'XS'), ('Dana', 26, 'Poloshirt', 'gelb', 'S')]
    [('Ingo', 27, 'Hemd', 'blau', 'S'), ('Dana', 26, 'Poloshirt', 'gelb', 'XS')]
    [('Ingo', 27, 'Hemd', 'gelb', 'XS'), ('Dana', 26, 'Poloshirt', 'blau', 'S')]
    [('Ingo', 27, 'Hemd', 'gelb', 'S'), ('Dana', 26, 'Poloshirt', 'blau', 'XS')]
    [('Ingo', 27, 'Poloshirt', 'blau', 'XS'), ('Dana', 26, 'Hemd', 'gelb', 'S')]
    [('Ingo', 27, 'Poloshirt', 'blau', 'S'), ('Dana', 26, 'Hemd', 'gelb', 'XS')]
    [('Ingo', 27, 'Poloshirt', 'gelb', 'XS'), ('Dana', 26, 'Hemd', 'blau', 'S')]
    [('Ingo', 27, 'Poloshirt', 'gelb', 'S'), ('Dana', 26, 'Hemd', 'blau', 'XS')]
    

    对于你所遇到的逻辑难题,使用排列的方法存在一个根本性的问题。问题甚至不是排列太多以至于你的解算器不可能在合理的时间内完成。问题是你没有一种自动检查规则的方法:拥有所有的排列除非您有方法验证,否则面前的IBility是毫无意义的

    为了解决这些问题,我创建了一个名为“解谜者”的项目:

    这是一个小项目,目前只包含一个感兴趣的类:。该类实现了解决问题中提出的消除过程类型问题所需的大多数操作。所有逻辑都是,这是您确切问题的演练。我将在这里解释基本知识,以便您了解我所做的工作,也许可以改进它

    步骤1是识别队列中的位置是一个属性,就像年龄、姓名等。这意味着顺序不再相关

    第2步是认识到这是一个伪装的图问题。你有30个节点:五个个体中每个个体的所有可能属性(其中六个)。图开始时几乎是完整的。只有给定类型的属性之间的边缺失,因此你从375开始,而不是完整的435条边

    最终的目标是在图中五个连接组件中的每一类属性之间有一条边。因此,最终的边数是5*15=75

    那么如何去除边缘呢?像“T恤衫不是红色”这样的简单规则非常简单:只需去除边缘。像“排队的最后一个人是30岁”这样的规则也很简单,而且在边缘移除方面更有利可图。所有年龄不到30岁和位置5之间的边缘都被移除,以及所有年龄不到5岁和位置30之间的边缘都被移除。我添加了两个半生不熟的工具包装,以检查大于或小于条件,并移除表示不可能组合的边缘

    解算器最重要的一点是,无论何时删除一条边,它都会完全遵循该操作的所有逻辑含义。假设“Poloshirt”是“红色”、“黄色”或“绿色”在你的谜题中,这三种颜色都与30岁无关。这意味着穿poloshirt的人不可能是30岁。事实上,“poloshirt”不能有任何边缘