麻烦问下大家怎么排列,这道题的思路我不太明白,救救。
暴力法:
import itertools as it
data = [[('马克', 4), ('波力', 1), ('尼克', 2), ('马尼', 3)],
[('马克', 1), ('波力', 4), ('尼克', 3), ('马尼', 2)],
[('马克', 3), ('波力', 1)],
[('马克', 4), ('波力', 3), ('尼克', 1), ('马尼', 2)]]
tmp = []
for i in data[2]: # 以第三次猜作为切入口
t0 = [j for j in data[0] if i[0] not in j or i == j] # 第1次猜的要么有一种与第三次一模一样,要么就不能出现第三次中的名字
t0 = list(it.combinations(t0, 2)) # 有一半对,就取两个组合
t1 = [j for j in data[1] if i[0] not in j or i == j] # 第2次猜的要么有一种与第三次一模一样,要么就不能出现第三次中的名字
t1 = list(it.combinations(t1, 2)) # 有一半对,就取两个组合
t3 = [j for j in data[3] if i[0] not in j or i == j] # 第4次猜的要么有一种与第三次一模一样,要么就不能出现第三次中的名字
t3 = list(it.combinations(t3, 2)) # 有一半对,就取两个组合
result = list(it.product(t0, t1, t3)) # 对上面第1,2,4次进行组合
for k in result: # 遍历组合,并用集合对每一组合合并
eee = set()
for kkk in k:
eee |= set(kkk)
if len(eee) == 4: # 将猜的结果有4个不同的选出,另再筛选
tmp.append(eee)
for i in tmp: # 对上面长度为4个的,选出人名和排行都唯一的结果
if len(dict(i).keys()) == 4:
print(i)
'''--result
{('马尼', 2), ('尼克', 3), ('波力', 1), ('马克', 4)}
'''