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 次重复,所以这可行。
简单地说,我想知道是否有一种方法可以打印出仅满足特定条件的抛硬币组合。在这种情况下,只有 <=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 次重复,所以这可行。