在 Python for 循环中跳过可变次数的迭代

Skip variable number of iterations in Python for loop

我有一个列表和一个 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 循环中 "jump" cp 个元素,并再次开始执行项目 item + cp 中要求的内容。

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

感谢您的回答! :)


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

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)")

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

您可以将 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)")

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

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

输出:

You bar are present in 2 copy(ies)

You hello are present in 1 copy(ies)

You foo are present in 3 copy(ies)

你也可以这样做

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

希望对您有所帮助!

set and list 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)

由于元素是连续的,您可以使用 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 进行计数:

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 是二次的。