Функция проверки списка списков имеет все целочисленные элементы от 0 до n, а списки имеют заданную длину? - PullRequest
1 голос
/ 13 апреля 2019

Я хочу проверить следующее для списка кортежей:

C = [[2, 2, 1, 3], [2, 2, 2, 1], [3, 3, 0, 3], [0, 2, 0, 3]] D = [[2, 2, 1, 3], [2, 2, 2, 1], [3, 3, 0, 3]]

Я хочу проверить, если список имеет длину n, где n> 0 и является целым числом, и этот список также имеет списки длины n.Убедитесь, что записи являются целыми числами от 0 до n-1

УСЛОВИЯ:

  • список имеет длину n
  • список содержит только числовые списки элементов внутри

  • списки в списке имеют длину n

  • списки внутри содержат элементы от 0 до n-1

  • элементы списков - целые числа

, поэтому для C это будет список длиной 4, он имеет списки длиной 4 и все целые числа от 0 до 4,поэтому функция должна вывести true.

Для D это будет false, поскольку список имеет длину 3, а списки внутри имеют длину 4.

Может кто-нибудь помочь, пожалуйста?

Я пробовал команду isinstance, но мой код становится очень запутанным со многими из них.Есть ли более простой способ сделать это?

Это то, что я имею до сих пор, оно не завершено.

def checklist(X):
    n = len(X) #check len
    n = int #check it is int
    if n>0: #condition n>0 
        if isinstance(X,list): #check if x is list 
            for i in range(n) :
                if isinstance(X[i],list): #check if the X contains list 
                   a = X[[i]]
                   if isinstance(a, int)



Ответы [ 3 ]

4 голосов
/ 13 апреля 2019

Использовать вложенный all с пониманием вложенного списка

C = [[2, 2, 1, 3], [2, 2, 2, 1], [3, 3, 0, 3], [0, 2, 0, 3]]

n = 4

def is_valid(C, n):
    valid_values = range(n)
    return all(all(x in valid_values for x in l) and len(l) == n for l in C) and len(C) == n

print is_valid(C, n)

Вывод:

True
2 голосов
/ 13 апреля 2019

Поскольку это было помечено с помощью NumPy, вот решение только для NumPy:

# input for positive case
C = [[2, 2, 1, 3], [2, 2, 2, 1], [3, 3, 0, 3], [0, 2, 0, 3]]
c_arr = np.array(C)  # convert to numpy array

# input for negative case
D = [[2, 2, 1, 3], [2, 2, 2, 1], [3, 3, 0, 3]]
d_arr = np.array(D)

# range to check for
n = 4

Включение всех необходимых условий в функцию Python (в соответствии с требованиями OP):

def check_condition(n, arr):
     if arr.shape[0] == n and np.all(arr >= 0) \
        and np.all(arr < n) and arr.dtype == np.int:
         return True
     else:
         return False

# checking for positive case        
check_condition(n, c_arr)   # returns `True`

# checking for negative case        
check_condition(n, d_arr)   # returns `False`
0 голосов
/ 14 апреля 2019

Я бы рекомендовал сосредоточиться на удобочитаемости и простоте для чего-то подобного.Легко потеряться при попытке выполнить несколько условий и сложнее понять, что вы делали, когда позже вернетесь к коду, если попытаетесь быть умным или как можно более кратким.Если вы сделаете требования отдельными и явными, вам будет легче увидеть, что вы их правильно тестируете.Ранний возврат может сделать ваш код менее отступным и легче читать.

def element_is_good(element, length):
    return isinstance(element, int) and 0 <= element < length

def sublist_is_good(sublist, length):
    return (isinstance(sublist, list)
            and len(sublist) == length
            and all(element_is_good(element, length) for element in sublist))

def list_of_lists_is_good(list_of_lists):
    n = len(list_of_lists)
    return n > 0 and all(sublist_is_good(sublist, n) for sublist in list_of_lists)

Это немного дольше, чем другие решения, но я бы сказал, что его легче читать, легче тщательно проверять иболее ремонтопригодны.(Он также удовлетворяет всем указанным вами требованиям; DroiX86 примет пустой список или список словарей, а kmario23 примет пустой массив или списокя пропустил ваше требование "n is int", потому что функция len возвращает только целые числа.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...