作为一个习惯用Python写作的项目(目前我唯一知道的语言)我正在写一个Cribbage分数计数器。
我从一组5个数字中找到了所有3个,4个和5个长度的子集。子集全部按数字顺序排序。下面的函数应该按顺序找到数字的子集,例如[1,2,3]或[3,4,5]。
def straight_counter(subset, length):
straights = []
a = 0 # Variable for incremental increase
for i in range(0, length - 2): # Select one of the first three numbers of a set of 3-5 (which are already ordered)
run = 1
x = 1
while i + x < length: # Ensure that we do not go beyond the final index
if subset[i + x - 1] + 1 == subset[i + x]: # Is the next number one greater than the currently selected number
run += 1 # Count how many numbers we have in order (will be maximum of 5)
x += 1
else:
break
这里是我尝试仅按顺序获取所有数字的子集的地方。但是当我尝试将其添加到嵌套列表中时,我每次都会在列表的第一个索引上进行写入,而且当我打印它时,列表只有一个项目
if run == length: # If the run of consecutive numbers uses all of the numbers e.g [1, 2, 3] and not [1, 2, 4]
straights.insert(a, subset) # I would like to add the list as the first index of a different list
a += 1 # Increase a so that the next valid subset will be at the next index
print(straights)
是否有明显的原因发生这种情况?或者可能有更简洁的尝试方式。感谢
例如,从输入的数字列表
[1,1,2,3,4]
我正在尝试创建一个嵌套列表:
[[1,2,3],[1,2,3],[2,3,4],[1,2,3,4],[1,2,3,4]]。
长度为3或更大的所有连续数字集合。
答案 0 :(得分:0)
好的,这是我的解决方案。想法是找到连续集的第一个和最后一个集。
# -*-coding:Utf-8 -*
data = [1, 4, 5, 6, 10, 15, 16, 17, 18, 22, 25, 26, 27, 28]
from operator import itemgetter
from itertools import groupby
for k, g in groupby(enumerate(data), lambda ix : ix[0] - ix[1]):
group = list(map(itemgetter(1), g))
print ((group[0], group[-1]))
此时你得到了这个:
(1, 1)
(4, 6)
(10, 10)
(15, 18)
(22, 22)
(25, 28)
然后你只需要选择正确的,并保持它们(差异超过2)。如果需要,您还可以重新创建列表。
答案 1 :(得分:0)
想象玩家有A-3-5-7和2-3-4-6
最大计数为(1 + 3 + 5 + 7)+(2 + 3 + 4 + 6)=&gt; 31.虽然组合的数量有限,而且牌的播放次序也有所不同。
顺便说一句:作为Cribbage琐事的一点(双关语),The Sting将会出现在Flix(09/02)和Showtime(09/07)。这是你会看到Cribbage在屏幕上播放的少数几个地方之一。