все возможные комбинации списка в пределах диапазона

#python

Вопрос:

У меня есть этот список:

вход : [1,7,8,9,10,11,19]

Я ищу этот вывод:

выход: [[1],[7],[7,8],[7,8,9],[7,8,9,10],[7,8,9,10,11],[8,9,10,11],[9,10,11],[10,11],[11] [19]]

на выходе у меня есть все группы, которые находятся в диапазоне 5 цифр. 1 входит (1,2,3,4,5) , внутри ничего (2,3,4,5,6) нет , затем входит 7 (3,4,5,6,7) и так далее…

Я пробовал эту программу, но она не дает мне того результата, который я ищу

 playersHand = []

table = [1,7,8,9,10,11,19]
for n in range(len(table)):
    playersHand.append(int(table[n]))
 
playersHand.sort()

cardsSet = set(playersHand)

possibleStraight = []
possibleStraightgrade = []
possibleStraightgradelist = []


for f in cardsSet:
    possibleStraightset = cardsSet.intersection(range(f,f 5))
    possibleStraightlist = list(possibleStraightset)
    possibleStraightlist.sort()
    possibleStraight.append(possibleStraightlist)
    
for n in possibleStraight:
        if n != 0:
            possibleStraightgrade = max(n)
            possibleStraightgradelist.append(possibleStraightgrade)

print(possibleStraight)
 

что дает мне это:

 [[1], [7, 8, 9, 10, 11], [8, 9, 10, 11], [9, 10, 11], [10, 11], [11], [19]]
 

Комментарии:

1. В чем именно заключается ваш вопрос?

2. Если вы пытаетесь напечатать все последовательные прогрессии, то в ожидаемом выводе вы упускаете такие вещи , как [8, 9, 10] , а также несколько синглетов.

3. Для каждой комбинации вы могли бы просто сделать [list(itertools.combinations(a, x)) for x in range(1,5)] — но я подозреваю, что вы хотите что-то более сложное в том, какие списки выводятся?

4. Возможно, вам захочется заглянуть во встроенную библиотеку «itertools». есть некоторые функции, которые вы могли бы использовать

5. В чем заключается логика? Почему [1, 7] , например, отсутствует?

Ответ №1:

Вы могли бы получить результат более непосредственно, используя понимание списка и установив пересечения с потенциальной серией из 5:

 L = [1,7,8,9,10,11,19]
S = [ sorted(s)
      for f in range(min(L),max(L)-3)                    # potential series
      for s in [set(range(f,f 5)).intersection(L)] if s] # intersection

print(S)
[[1], [7], [7, 8], [7, 8, 9], [7, 8, 9, 10], [7, 8, 9, 10, 11], 
 [8, 9, 10, 11], [9, 10, 11], [10, 11], [11], [19]]
 

Комментарии:

1. это результат, который я ищу, но почему вы ставите -3 в max(L)-3? Я понимаю, что это для удаления последних 3 [19], но не должно ли быть 5 [19] в конце диапазона(f,f 5)? Потому что, если L = [1,7,8,9,10,11,19,20,21], у меня должен был быть результат [[1], [7], [7, 8], [7, 8, 9], … , [10, 11], [11], [19], [19, 20], [19, 20, 21],[19,20,21],[19,20,21],[20,21],[21]], но вместо этого я получаю [ … [11], [19], [19, 20], [19, 20, 21]] с максимальным(L)-3, и я получаю […[11], [19], [19, 20], [19, 20, 21], [19, 20, 21], [19, 20, 21], [20, 21]]только с max(L), и в нем отсутствует последний [21]????

2. Ожидаемый результат начинал первую последовательность с 1, а последнюю-с 19, поэтому я предположил, что минимальное и максимальное значения в списке были границами ряда (т. Е. От [1…5] до [15…19]). Если он может достигать 21, независимо от содержимого списка, используйте for f in range(1,18) вместо for f in range(min(L),max(L)-3) , Если он может выходить за пределы (или даже раньше) диапазона значений, вы можете добавить/вычесть соответствующие значения из диапазона.

3. да, но если вы возьмете первый список L = [1,7,8,9,10,11,19], в конце у вас будет 5 x [19]. Есть ли какой-нибудь способ избавиться от них?

Ответ №2:

Вы можете попробовать это:

 a = [1,7,8,9,10,11,19]

# get all tuples
out = [t for i in range(max(a)) if (t:=tuple(x for x in a if x in range(i, i 5)))]
# remove possible duplicates while preserving order
out = list(dict.fromkeys(out))  
 

Это дает:

 [(1,),
 (7,),
 (7, 8),
 (7, 8, 9),
 (7, 8, 9, 10),
 (7, 8, 9, 10, 11),
 (8, 9, 10, 11),
 (9, 10, 11),
 (10, 11),
 (11,),
 (19,)]