如何为嵌套列表中的每一行运行一个函数?

时间:2017-06-07 22:25:38

标签: python python-2.7 list validation

我是一个Python新手,并试图编写代码来检查嵌套列表是否有一组有效的数字。每行和每列必须有效。我编写了一个名为check_sequence的函数,它验证列表是否具有有效的数字集。我如何从另一个函数调用该函数来检查该行是否有效?所以例如,我需要这样的东西用于check_rows:

check_sequence(list):
  checks if list is valid

check_rows(list):
  For each of the rows in the nested list call check_sequence

这是check_sequence的代码:

def check_sequence(mylist):
    pos = 0
    sequence_counter = 1
    while pos < len(mylist):
        print "The pos is: " + " " + str(pos)
        print "The sequence_counter is:" + " " + str(sequence_counter)
        for number in mylist:
            print "The number is:" + " " + str(number)
            if number == sequence_counter:
                sequence_counter = sequence_counter + 1
                pos = pos + 1
                break
            else:
                # if list is at the last position on the last item
                if sequence_counter not in mylist:
                    print "The pos is:" + " " + str(pos) + " and the last position is:"  + " "  + str(mylist[len(mylist) - 1])
                    print "False"
                    return False
    print "True"
    return True

所以我打电话给下面的主要方法:

check_square([[1, 2, 3],
           [2, 3, 1],
           [3, 1, 2]])

def check_square(list):
   if check_rows() and check_columns() == True:
       return True
   else:
       return False

4 个答案:

答案 0 :(得分:1)

您是否正在寻找循环迭代?

 check_sequence(list):
    #your check here

 check_rows(list):
     for row in list:
         if not check_sequence(row):
             return False
     return True

答案 1 :(得分:1)

鉴于嵌套列表是面向行的(行是最低维度),您可以简单地使用:

check_rows(list):
    return all(check_sequence(sublist) for sublist in list)

这里我们使用all(..)内置:当且仅当生成器(粗体部分)为{{1}的所有元素的真实性时,它才会计算为True },否则结果为True。因此,从其中一行无效的那一刻起,矩阵无效。

另一方面,如果嵌套列表是面向列的(列是最低维度),我们首先需要使用{{1}进行转置 }:

False

zip转置check_rows(list): return all(check_sequence(list(sublist)) for sublist in zip(*list)),我们使用zip(*..)确保list仍在使用列表(如果任何可迭代就足够了,list(..) } part可以省略。

答案 2 :(得分:1)

这是一个适用于任意2D列表的解决方案。

l = [[1,2,3],[1,2],[1,4,5,6,7]]
try:
    if len([1 for x in reduce(lambda x, y :x + y, l) if type(x) != type(0)]) > 0:
        raise Exception

catch Exception:
   pass # error, do something 

直觉是将列表展平,然后连续检查其类型是否为int

答案 3 :(得分:1)

你必须将两个函数分开,并认为第一个函数将返回对另一个函数的每个值的完整检查:

def check_sequence(lis):
  ret = True
  for row in lis:
    ret = ret and check_rows(row)
  return ret

def check_rows(row):
  ret = True
  for elem in row:
    pass #do your checking
  return ret

一个具体的例子可能是:

l = [[1,2,3],[1,2],[1,4,5,6,7]]
def check_sequence(lis):
  ret = True
  for row in lis:
    ret = ret and check_rows(row)
  return ret

def check_rows(row):
  return 1 in row #ask if 1 belongs to the list

check_sequence(l) ---> True
check_sequence([[1],[2,3]]) ---> False