我试图确定一个大的给定列表是否具有相同的连续元素。
所以,让我们说
lst = [1, 2, 3, 4, 5, 5, 6]
在这种情况下,我会返回true,因为有两个连续的元素lst[4]
和lst[5]
,它们是相同的值。
我知道这可能是通过某种循环组合完成的,但我想知道是否有更有效的方法来做到这一点?
答案 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)]