我有一个包含五个属性的列表,每个属性都有五个不同的值。我想生成它们的笛卡尔积并过滤所有独特的排列。
一些背景:
我需要它们作为我的输入值来解决逻辑难题。我在哪里检查规则以找到正确的解决方案。
from itertools import product
# input
names = ['Dana', 'Ingo', 'Jessica', 'Sören', 'Valerie']
ages = [26, 27, 30, 33, 35]
tops = ['Blouse', 'Poloshirt', 'Pullover', 'Sweatshirt', 'T-Shirt']
colors = ['blue', 'yellow', 'green', 'red', 'black']
sizes = ['XS', 'S', 'M', 'L', 'XL']
all_attributes = [names, ages, tops, colors, sizes]
# cartesian product (superset)
inputs = list(product(*all_attributes))
# the following code you do that...
也许一个简化的例子可以说清楚。
数据:
[['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), ('Ingo', 27),
[('Dana', 27), ('Ingo', 26)]]
也许您可以出于好奇告诉我,这些概念的具体数学名称是什么,我需要哪些?
谜题:
有五个朋友(Dana、Ingo、Jessica、Sören、Valerie)在购物中心的收银台前排队等候。他们都是不同的年龄(26、27、30、33、35),想为自己购买不同的上衣(衬衫、Polo 衫、套头衫、运动衫、T 恤)。上衣有不同的颜色(蓝色、黄色、绿色、红色、黑色)和尺寸(XS、S、M、L、XL)。
规则:
- “Dana”最想买的是“XL”。在她身后(但不是直接在后面)是一个穿着“黑色”上衣的人。
- “杰西卡”直接在一个想买“马球衫”的人面前等着。
- 排队的第二个人想买一件“黄色”上衣。
- “T 恤”不是“红色”。
- “Sören”想买一件“运动衫”。直接在他面前等候的人比他身后的人年长。
- 'Ingo' 需要一个尺寸为 'L' 的上衣。
- 排队的最后一个人是 30 岁。
- 最年长的人会购买尺寸最小的上衣。
- 直接在“Valerie”后面等候的人想买一件比“S”号大的“红色”上衣。
- 最年轻的人想买一件“黄色”上衣。
- 杰西卡要买一件“衬衫”。
- 第三个排队的人想买一件“M”号的上衣。
- “Poloshirt”是“红色”或“黄色”或“绿色”。