确定list是否具有python中相同的连续元素

时间:2016-08-01 21:50:11

标签: python python-2.7 list python-3.x

我试图确定一个大的给定列表是否具有相同的连续元素。

所以,让我们说

lst = [1, 2, 3, 4, 5, 5, 6]

在这种情况下,我会返回true,因为有两个连续的元素lst[4]lst[5],它们是相同的值。

我知道这可能是通过某种循环组合完成的,但我想知道是否有更有效的方法来做到这一点?

7 个答案:

答案 0 :(得分:10)

您可以在any()中使用itertools.groupby()和生成器表达式:

>>> from itertools import groupby
>>> any(sum(1 for _ in g) > 1 for _, g in groupby(lst))
True

或者作为更加Pythonic的方式,您可以使用zip(),以检查列表中是否至少有两个相同的连续项:

>>> any(i==j for i,j in zip(lst, lst[1:])) # in python-2.x for refusing of creating a list of all pairs use itertools.izip() instead.
True

注意:当你想要检查是否有超过2个连续的相同项目时,第一种方法是好的,否则,在这种情况下,第二种方法将采取蛋糕!

答案 1 :(得分:3)

您可以使用简单 any条件:

lst = [1, 2, 3, 4, 5, 5, 6]
any(lst[i]==lst[i+1] for i in range(len(lst)-1))
#outputs:
True
如果任何可迭代元素为any

,则

True返回True

答案 2 :(得分:2)

如果您正在寻找一种有效的方法来执行此操作并且列表是数字的,您可能希望使用numpy并应用diff(差异)函数:

>>> numpy.diff([1,2,3,4,5,5,6])
array([1, 1, 1, 1, 0, 1])

然后得到关于是否有任何连续元素的单一结果:

>>> numpy.any(~numpy.diff([1,2,3,4,5,5,6]).astype(bool))

首先执行diff,反转答案,然后检查结果元素的any是否为非零。

答案 3 :(得分:1)

一个简单的for循环应该这样做:

def check(lst):
    last = lst[0]
    for num in lst[1:]:
        if num == last:
            return True
        last = num
    return False


lst = [1, 2, 3, 4, 5, 5, 6]
print (check(lst)) #Prints True

这里,在每个循环中,我检查当前元素是否等于前一个元素。

答案 4 :(得分:1)

这里有一个更通用的@RestController public class SellerRestController { @Autowired SellerService sellerService; @RequestMapping(value="seller/register",method = RequestMethod.POST) public ResponseEntity<SellerBean> registerSeller(@RequestBody SellerBean sellerBean){ SellerBean seller = sellerService.registerSeller(sellerBean); return new ResponseEntity<>(seller,HttpStatus.OK); } } 单线:

numpy

此方法始终搜索整个数组,而 @Kasramvd 中的方法在首次满足条件时结束。因此哪种方法更快取决于连续数字的稀疏程度。 如果您对连续数字的位置感兴趣,并且必须查看数组的所有元素,则此方法应该更快(对于更大的数组(或更长的序列))。

number = 7
n_consecutive = 3
arr = np.array([3, 3, 6, 5, 8, 7, 7, 7, 4, 5])
#                              ^  ^  ^ 
 
np.any(np.convolve(arr == number, v=np.ones(n_consecutive), mode='valid') 
       == n_consecutive)[0]

如果您对特定值不感兴趣,但通常对所有连续数字不感兴趣,则 @jmetz 的答案略有不同:

idx = np.nonzero(np.convolve(arr==number, v=np.ones(n_consecutive), mode='valid') 
                             == n_consecutive)
# idx = i: all(arr[i:i+n_consecutive] == number)

答案 5 :(得分:0)

如果你想知道3个连续值是否等于7,我的解决方案。例如,intList =(7,7,7,8,9,1)的元组:

for i in range(len(intList) - 1):
        if intList[i] == 7 and intList[i + 2] == 7 and intList[i + 1] == 7:
            return True
    return False

答案 6 :(得分:0)

随着即将推出的Python 3.10 release schedule ,新的pairwise函数提供了一种在成对的连续元素之间滑动的方法,以便我们可以测试质量连续元素之间:

from itertools import pairwise

any(x == y for (x, y) in pairwise([1, 2, 3, 4, 5, 5, 6]))
# True

pairwise的中间结果:

pairwise([1, 2, 3, 4, 5, 5, 6])
# [(1, 2), (2, 3), (3, 4), (4, 5), (5, 5), (5, 6)]