#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,)]