检查是否在2d列表中连续发现了一个数字x次

时间:2016-01-21 21:47:06

标签: python python-3.x

我想知道是否连续j次找到列表中的数字,这是我的列表:

list=[[1, 1, 1,1],
      [0, 0, 0,0],
      [2, 2, 2,2]
      [2, 2, 2,2]]

这就是我写的:

def alignment(list,n,j):
for y in range (n):
    for x in range (n-j):
        counter = 0
        for z in range(j):
            if list[y][x]== list[y][x+z]:
                counter+=1
            if counter == j :
                return True

但是这个函数会检查是否连续找到任何数字,我想在这个函数中添加另一个参数,这样我就可以在列表中指定我想要查找的数字。 n表示有n行和列,j表示需要找到该数量的次数。

3 个答案:

答案 0 :(得分:0)

您的代码存在一些问题:

  • 不需要n参数,您可以使用len(list)
  • 获取列表的大小
  • 您不应将list用作变量名称,因为它会影响内置list函数
  • for x in range (n-j)您假设每个子列表与父列表具有相同数量的元素
  • 如果该数字连续显示超过True次,您的函数也会返回j
  • 你通过使用三个循环而不是两个
  • 来做很多双重工作

可以解决此问题,并添加要重复的数字的参数,如其他答案所示。但是,使用循环和条件,结果代码将非常笨拙。

相反,您可以使用anyitertools.groupby创建功能。 groupby组的数字相等,那么您只需检查这些组的len,看看any是否足够长,以及它是否是正确的数字any 1}}子列表。

def alignment(lst, num, count):
    return any(any(n == num and len(list(g)) == count 
                   for n, g in itertools.groupby(l)) 
               for l in lst)

如果True在任何子列表中连续num次出现,则会返回count

答案 1 :(得分:0)

您的要求不清楚。但是,这将是您的代码的略微修改版本,这将产生我认为您正在寻找的。

目标是您想知道 j 连续条目的数字。

def alignment(list,n,j,target):
    for y in range (n):
        for x in range (n-j):
            counter = 0
            if list[y][x] == target:
                for z in range(j):
                    if list[y][x]== list[y][x+z]:
                        counter+=1
                    if counter == j :
                        return True

答案 2 :(得分:0)

def alignment(nums,j,target):
    for row in nums:  # get each row
        counter = 0 
        for i in row:  # get each number 
            if i != target:  # check if some other number was gotten
                if counter == j:
                    return True
                counter = 0  # reset counter
                continue
            counter += 1
        if counter == j:
            return True
    return False

不需要n参数。