Python:具有相等和且无重复的整数列表

时间:2019-11-02 09:15:24

标签: python combinations permutation

对于范围为(1,13)的整数,我需要构建三个总计为13的整数的所有可能变体。变体不应重复。例如(1,2,10),(2,1,10),(10,1,2)和(10,2,1)都是一个变体的重复。因此,结果列表应仅具有该元组之一,而与哪一个无关。在结果元组中的不同位置处具有相等整数的变量(如(1,1,11))也有效。对于这些变体,重复将为(1,1,11),(1,11,1)和(11,1,1)。

也许是为了更好地解释问题,下面是它的来历:

两个朋友艾伦和德雷克见面。

艾伦:我有三个孩子。

Drake:他们几岁了?

艾伦:孩子年龄的总和等于13。

因此,我正在尝试获取所有可能年龄的列表。

我有这段代码,它会生成我需要删除的所有可能的重复内容:

ages = list(range(1,13))
kids_ages = []
for a in ages:
  for b in ages:
    for c in ages:
      if a + b + c == 13:
        kids_ages.append((a,b,c))

结果我得到:

([(1, 1, 11),
(1, 2, 10),
(1, 3, 9),
(1, 4, 8),
(1, 5, 7),
(1, 6, 6),
(1, 7, 5),
(1, 8, 4),
(1, 9, 3),
(1, 10, 2),
(1, 11, 1),
(2, 1, 10),
(2, 2, 9),
(2, 3, 8),
...

如何消除重复?

3 个答案:

答案 0 :(得分:1)

frozenset可以在这里帮助您删除重复项。

ages = list(range(1,13))
kids_ages = []
for a in ages:
  for b in ages:
    for c in ages:
      if a + b + c == 13:
        kids_ages.append((a,b,c))

result=set(map(frozenset, kids_ages))
print(result)

答案 1 :(得分:1)

尝试:

import itertools

res=list(sorted(el) for el in itertools.combinations_with_replacement(range(1, 14), 3) if sum(el)==13)

print(res)

输出:

[[1, 1, 11], [1, 2, 10], [1, 3, 9], [1, 4, 8], [1, 5, 7], [1, 6, 6], [2, 2, 9], [2, 3, 8], [2, 4, 7], [2, 5, 6], [3, 3, 7], [3, 4, 6], [3, 5, 5], [4, 4, 5]]

[Program finished]

答案 2 :(得分:0)

我通过仅考虑第一职位的最低年龄和第二职位的第二最低年龄来解决这个问题。这样,就不必查找重复项。

ages = list(range(1,13))
kids_ages = []
# First, pick the smallest age
for age1 in range(1,13):
    remaining_sum = 13 - age1
    # Pick the next smallest age
    for age2 in range(age1 + 1, 13):
        age3 = 13 - age1 - age2
        if age3 > age1 and age3 > age2:
            kids_ages.append( (age1, age2, age3) )

print kids_ages
# Result:
# [(1, 2, 10), (1, 3, 9), (1, 4, 8), (1, 5, 7), (2, 3, 8), (2, 4, 7), (2, 5, 6), (3, 4, 6)]

编辑:上面的解决方案不包含重复数字的变量,例如(1、1、11)。要包括这些内容,只需在代码中更改一个位置即可:

kids_ages = []
# First, pick the smallest age
for age1 in range(1,13):
    remaining_sum = 13 - age1
    # Pick the next smallest age, whch may be the same as the first
    for age2 in range(age1, 13):
        # Only a single number can be the third age. Check if it's valid.
        age3 = 13 - age1 - age2
        if age3 >= age2:
            kids_ages.append( (age1, age2, age3) )

# Result:
# [(1, 1, 11), (1, 2, 10), (1, 3, 9), (1, 4, 8), (1, 5, 7), (1, 6, 6), (2, 2, 9), (2, 3, 8), (2, 4, 7), (2, 5, 6), (3, 3, 7), (3, 4, 6), (3, 5, 5), (4, 4, 5)]

对于三个相同的数字,没有这样的解决方案总和为13。