python - 创建一个随机列表并计算 6 个字母的序列
问题描述
我正在尝试构建一个程序,该程序将创建一个随机的正面或反面列表('H','T'),然后计算'H'或'T'重复6次的次数。我想我已经找到了随机列表,当我独立运行它时效果很好。但是当涉及到计数时,我不确定如何让 python 检测列表中 6 个相同字母的序列。
for x in range(0, len(coin_list)-1):
if coin_list[x] == coin_list[x+1] and coin_list[x] == coin_list[x+2] and \
coin_list[x] == coin_list[x+3] and coin_list[x] == coin_list[x+4] and \
coin_list[x] == coin_list[x+5]:
streak_counter+=1
else:
continue
if streak_counter ==6:
numberOfStreaks+=1
streak_counter=0
else:
continue
首先,此块检查列表coin_list中的每个值,并检查其后面的所有 5 个值是否与第一个值相同。如果是,则streak_counter变量加一。然后程序检查streak_counter变量是否等于 6,如果是,则numberOfStreaks变量增加 1,并将streak_counter重置为 0。
当我运行这个程序时,我没有得到预期的结果。程序总是返回numberOfStreaks等于 0,因此条纹的百分比为 0%。
不知道我要去哪里错了。任何帮助将非常感激。
import random
numberOfStreaks = 0
for experimentNumber in range(10000):
# Code that creates a list of 100 'heads' or 'tails' values.
for i in range(100):
coin_list=[]
random_num=random.randint(0, 1)
if random_num == 1:
coin_list.append('H')
elif random_num == 0:
coin_list.append('T')
# Code that checks if there is a streak of 6 heads or tails in a row.
for x in range(0, len(coin_list)-1):
if coin_list[x] == coin_list[x+1] and coin_list[x] == coin_list[x+2] and \
coin_list[x] == coin_list[x+3] and coin_list[x] == coin_list[x+4] and \
coin_list[x] == coin_list[x+5]:
streak_counter+=1
else:
continue
if streak_counter ==6:
numberOfStreaks+=1
streak_counter=0
else:
continue
print(numberOfStreaks)
print('Chance of streak: %s%%' % (numberOfStreaks / 100))
解决方案
当前实现有什么问题(代币列表的生成)
在生成列表的代码中,您为应该在列表中的每个条目创建一个空列表。
for i in range(100):
coin_list=[] # <-- here you create an empty list
random_num=random.randint(0, 1)
if random_num == 1:
coin_list.append('H')
elif random_num == 0:
coin_list.append('T')
检查你的硬币列表的长度:
len(coin_list)
output: 1
修复它的想法
您可以通过在循环之外定义列表来解决此问题:
coin_list=[]
for i in range(100):
random_num=random.randint(0, 1)
if random_num == 1:
coin_list.append('H')
elif random_num == 0:
coin_list.append('T')
由于您random
无论如何都在使用,您可以查看random.choice
:
coin_list = []
coins = ['H', 'T']
for i in range(100):
coin_list.append(random.choice(coins))
在这两种更正的情况下,列表的长度都是 100。
条纹计数有什么问题
接下来,streak_counter
在被引用之前是没有定义的,所以应该定义:
streak_counter = 0
您编写的用于检查条纹的循环将遇到以下错误:
IndexError: list index out of range
这是因为您让x
从 0 到列表的长度为 -1,但随后使用 x+2,3,4,5 访问列表项。当您的循环到达列表后面的第 4 个项目时,它将尝试访问列表之外的项目,从而导致错误。
for x in range(0, len(coin_list)-1):
if coin_list[x] == coin_list[x+1] and coin_list[x] == coin_list[x+2] and \
coin_list[x] == coin_list[x+3] and coin_list[x] == coin_list[x+4] and \
coin_list[x] == coin_list[x+5]: # < -- here you are accessing x+5
streak_counter+=1
else:
continue
if streak_counter ==6:
numberOfStreaks+=1
streak_counter=0
else:
continue
对此的解决方法是让x
从 0 运行到len(list)-5
,这将允许循环完成。但是,检查条纹的方式有点奇怪:
for x in range(0, len(coin_list)-5):
print(x)
if coin_list[x] == coin_list[x+1] and coin_list[x] == coin_list[x+2] and \
coin_list[x] == coin_list[x+3] and coin_list[x] == coin_list[x+4] and \
coin_list[x] == coin_list[x+5]:
streak_counter+=1
else:
continue
该if
语句检查您的列表中是否有六个连续的相同条目。如果是这种情况,则增加streak_counter
.
接下来,您检查是否streak_counter
是6
,然后将其计为连续和增量numberOfStreaks
。
if streak_counter ==6:
numberOfStreaks+=1
streak_counter=0
else:
continue
这里的问题是,对于 streak_counter 为 6,if coin_list[x] == ...
条件必须满足六次。因此,您需要至少 11 个连续相同的值来记录连续 6 个。
试图修复它
现在,如何解决这个问题,我认为取决于您如何计算连胜数:7 个正面的序列是一个连胜七个,还是两个连胜六个?
对于前一种情况,您可以执行以下操作:
s = ''.join(coin_list) # convert everything to string
tails_streaks = []
heads_streaks = []
for tails in s.split('H'): # remove all heads and check if what remains is at least 6 long
if len(tails) >=6:
tails_streaks.append(len(tails))
for heads in s.split('T'): # ditto for tails
if len(heads) >=6:
heads_streaks.append(len(heads))
如果要计算所有出现的六个连续相同结果(这意味着多次计算一枚硬币):
tails_sixes = []
heads_sixes = []
for tails in s.split('H'):
if len(tails) >=6:
tails_sixes += 1 + len(tails) - 6
for heads in s.split('T'):
if len(heads) >=6:
heads_sixes += 1 + len(tails) - 6
推荐阅读
- html - graphviz 中的展开/折叠表格
- python - 在 Python 或 PostgreSQL 中操作数据是否更快、内存效率更高?
- regex - 正则表达式选择第一个和最后一个引号字符
- php - symfony make:entity 在新项目上崩溃
- java - 为什么 ArrayBlockingQueue 构造函数使用 ReentrantLock 来获得可见性?
- javascript - 如何获得对我的 meme 命令的评论和赞成的数量?不和谐.js
- numpy - 将 VGG16 形状输出从 4096 个特征转换为 2048 个
- javascript - 有没有像 onChange 这样的函数也会监听 JavaScript 的变化?
- javascript - 如何让我的按钮用 javascript 做某事
- python - 合并 DataFrame 时的空结果