我要检查以下内容以获取元组列表:
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
列表具有介于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)
答案 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。)