在 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)
groupby 和 dict 逻辑都是 O(n)
,使用你的 list.count
是二次的。
我有一个列表和一个 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)
groupby 和 dict 逻辑都是 O(n)
,使用你的 list.count
是二次的。