计算200个硬币翻转中最长的头部和尾部序列.
我这样做了 - 在python中有没有更快的方法呢?(没有太混淆)
import random
def toss(n):
count = [0,0]
longest = [0,0]
for i in xrange(n):
coinface = random.randrange(2)
count[coinface] += 1
count[not coinface] = 0
if count[coinface] > longest[coinface]:
longest[coinface] = count[coinface]
#print coinface, count, longest
print "longest sequence heads %d, tails %d" %tuple(longest)
if __name__ == '__main__':
toss(200)
Run Code Online (Sandbox Code Playgroud)
看到这是为了促使我的演奏
Sil*_*ost 11
def coins(num):
lst = [random.randrange(2) for i in range(num)]
lst = [(i, len(list(j))) for i, j in itertools.groupby(lst)]
tails = max(j for i, j in lst if i)
heads = max(j for i, j in lst if not i)
return {1: tails, 0: heads}
Run Code Online (Sandbox Code Playgroud)
Ale*_*lli 11
import collections, itertools, random
def makesequence(choices=2, length=200):
return [random.randrange(choices) for _ in itertools.repeat(None, length)]
def runlengths(sequence):
runlength_by_item = collections.defaultdict(set)
for key, group in itertools.groupby(sequence):
runlength_by_item[key].add(sum(1 for _ in group))
return dict((k, max(v)) for k, v in runlength_by_item.items())
Run Code Online (Sandbox Code Playgroud)
正如您将注意到的,这更加"分离" - runlengths是一种确定任何可迭代中不同可清洗项目的最大运行长度的完全通用方法(如果您在各种不同的上下文中需要这样的运行长度,则可高度重用) ),就像makesequence给出列表长度和每个随机数的选择数量的随机数列表一样,这是一种完全通用的方法.将这两者放在一起可能无法为给定的,高度具体的问题提供最佳的点解决方案,但它会接近,并且构建可重复使用的"构建块"的小库将比仅解决每个问题具有更高的长期回报.完全专用的代码的具体问题.
你可以使用itertools,这是更多Pythonic方式来做到这一点:
def toss(n):
rolls = [random.randrange(2) for i in xrange(n)]
maximums = [0, 0]
for which, grp in itertools.groupby(rolls):
maximums[which] = max(len(list(grp)), maximums[which])
print "Longest sequence of heads %d, tails %d" % tuple(maximums)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
864 次 |
| 最近记录: |