【问题标题】:Skip variable number of iterations in Python for loop在 Python for 循环中跳过可变次数的迭代
【发布时间】:2016-10-15 00:10:57
【问题描述】:

我有一个列表和一个 for 循环,例如:

mylist = ['foo','foo','foo','bar,'bar','hello']
for item in mylist:
    cp = mylist.count(item)
    print("You "+item+" are present in "+str(cp)+" copy(ies)")

输出:

You foo are present in 3 copy(ies)
You foo are present in 3 copy(ies)
You foo are present in 3 copy(ies)
You bar are present in 2 copy(ies)
You bar are present in 2 copy(ies)
You dude are present in 1 copy(ies)

预期输出:

You foo are present in 3 copy(ies)
You bar are present in 2 copy(ies)
You dude are present in 1 copy(ies)

因此,我们的想法是在 for 循环中跳过可变数量的迭代,使用类似以下脚本(不工作):

for item in mylist:
    cp = mylist.count(item)
    print("You "+item+" are present in "+str(cp)+" copy(ies)")
    continue(cp)

因此,该脚本将在每一轮中“跳转”for 循环中的cp 元素,并再次开始执行它在项目item + cp 处所要求的操作。

我知道您可以使用continue 来跳过多次迭代(例如在this post 中),但我不知道如何使用continue 来跳过可变数量的迭代

感谢您的回答! :)


编辑:相似的项目总是彼此相邻。

【问题讨论】:

  • 这个列表是否总是排序/分组,例如相同的元素总是在一起?
  • @Jerzyk 确实如此!

标签: python for-loop continue


【解决方案1】:
mylist = ['foo','foo','foo','bar','bar','hello']
last = None
for item in mylist:
    if item is last:
        continue

    last = item
    cp = mylist.count(item)
    print("You "+item+" are present in "+str(cp)+" copy(ies)")

这假定列表是有序的,因此相同的对象彼此相邻。

【讨论】:

    【解决方案2】:

    您可以将 collections.Counter 用于您的工作:

    >>> from collections import Counter
    >>> Counter(['foo', 'foo', 'bar'])
    Counter({'foo': 2, 'bar': 1})
    

    因此,

    count_dict = Counter(mylist)
    for item in count_dict:
        print("You "+item+" are present in "+str(count_dict[item[)+" copy(ies)")
    

    【讨论】:

      【解决方案3】:

      你可以使用Counter:

      from collections import Counter
      
      mylist = ['foo','foo','foo','bar','bar','hello']
      c = Counter(mylist)
      for item, cp in c.items():
          print("You "+item+" are present in "+str(cp)+" copy(ies)")
      

      【讨论】:

      • Counter 对象没有属性iteritems
      • @pythad 这是 python 2 而不是 3。在 3 中使用 items()
      • 更新了使用items 的答案,因为它适用于 2 和 3。感谢您的评论。
      【解决方案4】:

      您可以使用set获取列表的唯一元素

      mylist = ['foo','foo','foo','bar','bar','hello']
      uniq_list = set(my_list)
      for item in uniq_list:
          cp = mylist.count(item)
          print("You "+item+" are present in "+str(cp)+" copy(ies)")
      

      输出:

      你的酒吧存在于 2 个副本中

      你好存在于 1 个副本中

      你的 foo 出现在 3 个副本中

      【讨论】:

      • 这是O(n^2),而不是使用计数器的O(n)
      • 我知道这一点,但问题不是找到最快的解决方案,而是如何去做。万一列表变得很长,另一种方法肯定是有意义的。
      • 这也会为每次迭代创建一个新的set
      • 在我发表评论时,这比 Counter 方法多出两票,因此对于未来的读者来说,值得指出
      • @Padraic Cunningham:你的方法肯定更灵活、更快捷,+1。
      【解决方案5】:

      你也可以这样做

      mylist = ['foo','foo','foo','bar','bar','hello']
      prev = None
      for item in mylist:
          if item != prev:
              cp = mylist.count(item)
              print("You "+item+" are present in "+str(cp)+" copy(ies)")
              prev = item
      

      希望对你有帮助!

      【讨论】:

        【解决方案6】:

        setlist counts 可以解决问题:

        mylist = ['foo','foo','foo','bar','bar','hello']
        for item in set(mylist):
            print("You "+item+" are present in "+str(mylist.count(item))+" copy(ies)")
        

        输出:

        You foo are present in 3 copy(ies)
        You bar are present in 2 copy(ies)
        You hello are present in 1 copy(ies)
        

        【讨论】:

          【解决方案7】:

          由于元素是连续的,您可以使用 groupby 对连续的字符串进行分组,只需将每个组的长度相加即可获得计数:

          from itertools import groupby
          mylist = ['foo','foo','foo','bar','bar','hello']
          
          for k,v in groupby(mylist):
              print("You {} are present in {} copy(ies)".format(k, sum(1 for _ in v)))
          

          输出:

          You foo are present in 3 copy(ies)
          You bar are present in 2 copy(ies)
          You hello are present in 1 copy(ies)
          

          通常获取计数的最有效方法是使用字典逻辑,如其他答案中提供的 Counter,如果您想保持顺序,可以使用 OrderedDict em> 进行计数:

          from collections import OrderedDict
          mylist = ['foo','foo','foo','bar','bar','hello']
          od = OrderedDict()
          for ele in mylist:
              od.setdefault(ele, 0)
              od[ele] += 1
          
          for tup in od.items():
              print("You {} are present in {} copy(ies)".format(*tup))
          

          输出相同:

          You foo are present in 3 copy(ies)
          You bar are present in 2 copy(ies)
          You hello are present in 1 copy(ies)
          

          groupbydict 逻辑都是 O(n),使用您的 list.count 是二次的。

          【讨论】:

            猜你喜欢
            • 2021-08-23
            • 1970-01-01
            • 2021-11-15
            • 1970-01-01
            • 2013-07-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多