Python:能否修改抛硬币生成器以打印出某些组合?

Python: Can a coin flip generator be modified to printout certain combinations?

简单地说,我想知道是否有一种方法可以打印出仅满足特定条件的抛硬币组合。在这种情况下,只有 <=n 个连续的 H 或 T 才会被打印出来。

例如,以下是使用 itertools.product*:

的 5 次抛硬币的所有可能组合
>>> list(itertools.product('HT', repeat=5))
[('H', 'H', 'H', 'H', 'H'), ('H', 'H', 'H', 'H', 'T'), ('H', 'H', 'H', 'T', 'H'), ('H', 'H', 'H', 'T', 'T'), 
('H', 'H', 'T', 'H', 'H'), ('H', 'H', 'T', 'H', 'T'), ('H', 'H', 'T', 'T', 'H'), ('H', 'H', 'T', 'T', 'T'), 
('H', 'T', 'H', 'H', 'H'), ('H', 'T', 'H', 'H', 'T'), ('H', 'T', 'H', 'T', 'H'), ('H', 'T', 'H', 'T', 'T'), 
('H', 'T', 'T', 'H', 'H'), ('H', 'T', 'T', 'H', 'T'), ('H', 'T', 'T', 'T', 'H'), ('H', 'T', 'T', 'T', 'T'), 
('T', 'H', 'H', 'H', 'H'), ('T', 'H', 'H', 'H', 'T'), ('T', 'H', 'H', 'T', 'H'), ('T', 'H', 'H', 'T', 'T'), 
('T', 'H', 'T', 'H', 'H'), ('T', 'H', 'T', 'H', 'T'), ('T', 'H', 'T', 'T', 'H'), ('T', 'H', 'T', 'T', 'T'), 
('T', 'T', 'H', 'H', 'H'), ('T', 'T', 'H', 'H', 'T'), ('T', 'T', 'H', 'T', 'H'), ('T', 'T', 'H', 'T', 'T'), 
('T', 'T', 'T', 'H', 'H'), ('T', 'T', 'T', 'H', 'T'), ('T', 'T', 'T', 'T', 'H'), ('T', 'T', 'T', 'T', 'T')]

但是,我希望打印输出仅显示连续不超过三个 H 或 T 的结果。像这样:

[('H', 'H', 'H', 'T', 'H'), ('H', 'H', 'H', 'T', 'T'), ('H', 'H', 'T', 'H', 'H'), ('H', 'H', 'T', 'H', 'T'), 
('H', 'H', 'T', 'T', 'H'), ('H', 'H', 'T', 'T', 'T'), ('H', 'T', 'H', 'H', 'H'), ('H', 'T', 'H', 'H', 'T'), 
('H', 'T', 'H', 'T', 'H'), ('H', 'T', 'H', 'T', 'T'), ('H', 'T', 'T', 'H', 'H'), ('H', 'T', 'T', 'H', 'T'), 
('H', 'T', 'T', 'T', 'H'), ('T', 'H', 'H', 'H', 'T'), ('T', 'H', 'H', 'T', 'H'), ('T', 'H', 'H', 'T', 'T'), 
('T', 'H', 'T', 'H', 'H'), ('T', 'H', 'T', 'H', 'T'), ('T', 'H', 'T', 'T', 'H'), ('T', 'H', 'T', 'T', 'T'), 
('T', 'T', 'H', 'H', 'H'), ('T', 'T', 'H', 'H', 'T'), ('T', 'T', 'H', 'T', 'H'), ('T', 'T', 'H', 'T', 'T'), 
('T', 'T', 'T', 'H', 'H'), ('T', 'T', 'T', 'H', 'T')]

*显然这不是实现它的唯一方法,它恰好是我遇到的一种方法,因为我还是编程新手。

~更新~

dabljues 建议如下:

In [38]: all_combinations = itertools.product('HT', repeat=5) 
    ...: not_more_than_3_combinations = [] 
    ...: for combination in all_combinations: 
    ...:     for _, group in itertools.groupby(combination): 
    ...:         if sum(1 for _ in group) <= 3:            
    ...:             not_more_than_3_combinations.append(combination) 
    ...:         break 
    ...: print(not_more_than_3_combinations)

还不确定如何实施(同样,我是初学者)但它看起来最有前途。

谢谢。

请记住,它甚至被打印出来的事实是因为您使用的是解释器。如果您碰巧在编辑器中编写此代码并 运行 通过例如一个终端,不会有输出。

现在,您要打印那些连续不超过 3 个 H 或 T 的组合。 itertools 软件包不会为您做这件事。这个需要你自己实现。

例如:

In [38]: all_combinations = itertools.product('HT', repeat=5) 
    ...: not_more_than_3_combinations = [] 
    ...: for combination in all_combinations: 
    ...:     for _, group in itertools.groupby(combination): 
    ...:         if sum(1 for _ in group) <= 3:            
    ...:             not_more_than_3_combinations.append(combination) 
    ...:         break 
    ...: print(not_more_than_3_combinations)
[('H', 'H', 'H', 'T', 'H'), ('H', 'H', 'H', 'T', 'T'), ('H', 'H', 'T', 'H', 'H'), ('H', 'H', 'T', 'H', 'T'), ('H', 'H', 'T', 'T', 'H'), ('H', 'H', 'T', 'T', 'T'), ('H', 'T', 'H', 'H', 'H'), ('H', 'T', 'H', 'H', 'T'), ('H', 'T', 'H', 'T', 'H'), ('H', 'T', 'H', 'T', 'T'), ('H', 'T', 'T', 'H', 'H'), ('H', 'T', 'T', 'H', 'T'), ('H', 'T', 'T', 'T', 'H'), ('H', 'T', 'T', 'T', 'T'), ('T', 'H', 'H', 'H', 'H'), ('T', 'H', 'H', 'H', 'T'), ('T', 'H', 'H', 'T', 'H'), ('T', 'H', 'H', 'T', 'T'), ('T', 'H', 'T', 'H', 'H'), ('T', 'H', 'T', 'H', 'T'), ('T', 'H', 'T', 'T', 'H'), ('T', 'H', 'T', 'T', 'T'), ('T', 'T', 'H', 'H', 'H'), ('T', 'T', 'H', 'H', 'T'), ('T', 'T', 'H', 'T', 'H'), ('T', 'T', 'H', 'T', 'T'), ('T', 'T', 'T', 'H', 'H'), ('T', 'T', 'T', 'H', 'T')]

因此,您获得所有组合,然后迭代它们。使用 .groupby() 可以将项目分组到 ['H', 'H', 'H']['T', 'T'] 等组中。您检查它们中的第一个是否长度为 <=3。如果是,那么从您的角度来看,这是一个有效的组合。无论您是否添加此组合,您都会跳过检查此组合以不添加两次或添加它,因为一组符合您的条件(f.e。4 Hs 没有通过 if 检查,但 1 T 工作正常,所以它将被添加)。

因为您只有 2 种可能性(H 和 T)并且只有 5 次重复,所以这可行。