【问题标题】:How do I return a set of n consecutive integers given n and an iterable?如何在给定 n 和一个可迭代的情况下返回一组 n 个连续整数?
【发布时间】:2015-10-30 02:15:13
【问题描述】:

例如,调用 consec(2, [2, 2, 3, 9, 9, 10, 1, 6, 6]) 返回 {2, 9, 6}.我不能在itertools 中使用任何东西,我只能使用nextiter,而且我无法制作辅助列表来跟踪值或使用len。

这是我目前所拥有的:

consec(n,iterable):

result = set()
count = 0
y = iter(iterable)
j = iter(iterable)
next(j)
try:
    while True:
        for x in y:
            if x in result:
                 continue
            for m in range(n):
                if x == next(j):
                    count += 1
                    if count == n-1:
                        result.add(x)
                else:
                    count = 0
                    break
except StopIteration:
    return result

【问题讨论】:

    标签: python loops python-3.x while-loop iteration


    【解决方案1】:

    使用简单的for 循环遍历可迭代对象中的值应该很容易做到这一点。只需计算您连续看到当前值的次数,当它达到n 时,将其添加到结果中:

    def consec(n, iterable):
        result = set()
        prev = None # use object() here instead if None could be a value in the iterable
        count = 0
        for item in iterable:
            if item == prev:
                count += 1
                if count == n:
                    result.add(prev)
            else:
                prev = item
                count = 1
        return result
    

    我不想避免重复计算相同的值,因为set 会忽略添加到其中的任何重复值。

    如果您出于某种原因需要使用while 循环,您可以随时将for 循环转换为一个。

    for 循环:

    for item in iterable:
        stuff(item)
    

    几乎等同于:

    it = iter(iterable)
    try:
        while True:
            item = next(it)
            stuff(item)
    except StopIteration:
        del it
    

    两个版本之间的唯一区别是在迭代期间存在it 变量。 (for 循环使用的迭代器永远不会绑定到变量名。)

    【讨论】:

      【解决方案2】:
      def consec(n,l):
          return set(ele for i,ele in enumerate(l[:-1]) if all(ele == j for j in l[i:i+n]))
      

      或者使用范围和索引来代替切片:

      def consec(n,l):
           return set(ele for i, ele in enumerate(l[:-n+1]) if all(ele == l[j] for j in range(i,i+n)))
      

      如果必须使用next,请使用n-1范围内的内部循环,查看所有next n-1和prev是否相等,如果循环结束则添加到集合中:

      def consec(n,l):
          it = iter(l)
          prev = next(it)
          st = set()
          while prev != "":
              for i in range(n-1):
                  ele = next(it,"")
                  if ele != prev or ele == "":
                      break
                  prev = ele
              else:
                  st.add(ele)
              prev = ele
          return st
      

      【讨论】:

        【解决方案3】:

        递归执行:

        GlobalCons = 2
        def recurse(list, previous, consecCount):
          if(list == []):
            return []  
          if(consecCount != GlobalCons and previous == list[0]):
            return recurse(list[1:], list[0], consecCount + 1)
          if(consecCount == GlobalCons previous == list[0]):
            return [previous] + recurse(list[1:], list[0], consecCount + 1)
          else:
            return recurse(list[1:], list[0], 1)
        

        【讨论】:

          【解决方案4】:

          你可以使用itertools.groupby:

          def consec(n, iterable):
              return [k for k, g in itertools.groupby(iterable) if len(list(g)) == n]
          

          例子:

          >>> consec(2, [2, 2, 3, 9, 9, 10, 1, 6, 6])
          [2, 9, 6]
          

          编辑:哎呀,我想我把“我不能在 itertools 中使用任何东西”读作“我在 itertools 中找不到任何可以使用的东西”,但您可能的意思是“我不允许这样做”。不管怎样,我会把这个留给那些可以使用itertools...

          的人

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-06-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-01-20
            • 2021-12-01
            相关资源
            最近更新 更多