检查列表列表的函数具有0到n之间的所有整数元素,并且列表是否都具有给定的长度?

时间:2019-04-13 20:16:06

标签: python python-3.x numpy

我要检查以下内容以获取元组列表:

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,这将是错误的,因为列表的长度为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 个答案:

答案 0 :(得分:4)

使用具有嵌套列表理解功能的嵌套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

答案 1 :(得分:2)

由于已使用NumPy进行了标记,因此这里是仅NumPy的解决方案:

import ClassicEditor from "@ckeditor/ckeditor5-build-classic";

将所有必需的条件并入Python函数(OP要求):

# 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

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

答案 2 :(得分:0)

我建议您将注意力放在此类的可读性和简单性上。当试图满足多个条件时,很容易迷失方向;如果以后尝试变得更聪明或尽可能简洁,那么当您稍后回到代码时,很难弄清楚自己在做什么。如果将需求分开和明确地列出,则可以更轻松地看到正在正确测试它们。尽早返回可以使您的代码缩进更少,也更易于阅读。

export class EventsPage {
 index: any;
 categories_list: any;
 timeArray: any[];
 phone: any;
 pic_url: any;
 timing: any;
 category: any;
 email: any;
 description: any;
 website: any;
 address: any;
 title: any;
 date: any;
 events: any;
 selectOptions: { title: string; subTitle: string; mode: string; };
 readMoreFlag: boolean;
 noCategory: boolean;
 events_array: any;

 constructor(public http: Http, public ServerUrl: RemoteServiceProvider, 
  public navCtrl: NavController, public navParams: NavParams) {
   this.showEvents();

 }

showEvents() {
 this.ServerUrl.showEventDetails()
  .then(data => {
    this.events = data;
    console.log("events:", this.events);
    this.noCategory = false;
    this.events.forEach(element => {
      element.readMoreFlag = false;
      element.contentFlag = false;
      this.pic_url = element.pic_url;
      console.log("pic_url", this.pic_url);
    });

    this.timeArray = this.events;


  });

}

details(eventGet: any[]) {
  for (var value of this.events) {
  // console.log(value);
  console.log("1", value.pic_url);
  console.log("1", value.date);
  console.log("1", value.timing);
  console.log("1", value.address);
  console.log("1", value.description);
  console.log("1", value.phone);
  console.log("1", value.email);
  console.log("1", value.website);
}

this.navCtrl.push(EventsDetailPage, { });
// Here i want to push some clicked event details to show in next page.Like pic_url, title, address, phone etc. 
}


}

这比其他解决方案要长一些,但是我认为它更易于阅读,更易于测试和更易于维护。 (它也满足您列出的所有 要求; DroiX86's将接受一个空列表或字典列表,而kmario23's将接受一个空数组或元组列表。我省略了您的“ n is int”要求,因为len函数仅返回int。)