是否有更简洁/ pythonic的方式来做到这一点?(计算头部最长的seq,硬币翻转的尾巴)

Ste*_*e D 11 python

计算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)

  • 感谢上帝,其他人使用`itertools`而不是投票支持当前领先的字符串分裂和加入恐怖. (2认同)

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给出列表长度和每个随机数的选择数量的随机数列表一样,这是一种完全通用的方法.将这两者放在一起可能无法为给定的,高度具体的问题提供最佳的点解决方案,但它会接近,并且构建可重复使用的"构建块"的小库将比仅解决每个问题具有更高的长期回报.完全专用的代码的具体问题.

  • 你能使用len(group)而不是sum(1为_组)? (2认同)
  • @Emil:`group`是一个`itertools._grouper`对象,它没有`len`,另一种方法是首先将它转换为`list`. (2认同)

Jed*_*ith 7

你可以使用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)