简洁地确定一对在一个较长的lis中存在多少次

2024-09-25 00:22:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一大块代码,我想缩短长度or表达式。 假设我们有一个列表,比如:

farm = ["cow","cow","cow", "hen","hen","hen", "fox","fox","fox", "hen","hen", "hen"]
lookup = ["cow","hen"]

我应该检查在farm列表中是否有lookfor的三个连续元素。你知道吗

一种方法是:

for i in range (0,len(farm) - 2):
  if ((farm[i] == farm[i+1] == farm[i+2] == lookup[0])
     or (farm[i] == farm[i+1] == farm[i+2] == lookup[1])):
    # do something

现在,如果lookup中的元素数很小,可以用上面的方法来写。但是,如果太长,代码看起来很麻烦,而且很难维护。有没有一种更简洁的方法来编写代码,也许是以列表理解格式编写的,这样我就不必手动编写来查找lookup的所有元素了?你知道吗


Tags: or方法代码in元素列表for表达式
2条回答

未经测试,但一些“像这样”;—)应该工作。any()是处理任意数目的or的自然方式,而all()是处理任意数目的and的自然方式

if any(farm[i] == farm[i+1] == farm[i+2] == target for i in range(len(farm) - 2)
       for target in lookup):
    # do something

如果你需要i

此变体将为您提供匹配的i值,与原始代码非常相似:

for i in range (0,len(farm) - 2):
   if any(farm[i] == farm[i+1] == farm[i+2] == target for target in lookup):
       print(i)    

试试这个

gr = [(k,len(list(ns))) for k,ns in itertools.groupby(farm)]
for k in lookup:
    if (k,3) in gr:
        print k

将检查精确的连续三个键。对于至少三个,您可以按大小筛选组,并检查每个条目是否在查找中。你知道吗

相关问题 更多 >