我刚刚在代码中发现了一个逻辑错误,导致了各种各样的问题.我无意中做了一个按位AND而不是逻辑AND.
我更改了代码:
r = mlab.csv2rec(datafile, delimiter=',', names=COL_HEADERS)
mask = ((r["dt"] >= startdate) & (r["dt"] <= enddate))
selected = r[mask]
Run Code Online (Sandbox Code Playgroud)
至:
r = mlab.csv2rec(datafile, delimiter=',', names=COL_HEADERS)
mask = ((r["dt"] >= startdate) and (r["dt"] <= enddate))
selected = r[mask]
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,我收到了相当神秘的错误消息:
ValueError:具有多个元素的数组的真值是不明确的.使用a.any()或a.all()
为什么在使用按位操作时没有发出类似的错误 - 我该如何解决这个问题?
我有一个包含20000个列表的列表.我使用每个列表的第3个元素作为标志.我希望在此列表上执行一些操作,只要至少有一个元素的标志为0,它就像:
my_list = [["a", "b", 0], ["c", "d", 0], ["e", "f", 0], .....]
Run Code Online (Sandbox Code Playgroud)
在开始时,所有标志都是0.我使用while循环来检查至少一个元素的标志是否为0:
def check(list_):
for item in list_:
if item[2] == 0:
return True
return False
Run Code Online (Sandbox Code Playgroud)
如果check(my_list)返回True,那么我继续处理我的列表:
while check(my_list):
for item in my_list:
if condition:
item[2] = 1
else:
do_sth()
Run Code Online (Sandbox Code Playgroud)
实际上,当我迭代它时,我想删除my_list中的一个元素,但是当我迭代它时,我不允许删除项目.
原始的my_list没有标志:
my_list = [["a", "b"], ["c", "d"], ["e", "f"], .....]
Run Code Online (Sandbox Code Playgroud)
因为我迭代它时无法删除元素,所以我发明了这些标志.但是它my_list包含很多项,并且while循环在每个for循环中读取所有项,并且它会消耗大量时间!你有什么建议吗?
我需要验证列表是否是另一个列表的一个子集 - 布尔返回是我寻求的全部内容.
在交叉路口之后测试相等的较小列表是最快的方法吗?
考虑到需要比较的数据集数量,性能至关重要.
根据讨论添加更多事实:
在这种情况下,最佳解决方案是什么?
我有一个Python列表,我想检查是否有任何元素是否定的.Specman有has()列表的方法:
x: list of uint;
if (x.has(it < 0)) {
// do something
};
Run Code Online (Sandbox Code Playgroud)
itSpecman关键字在哪里依次映射到列表的每个元素.
我觉得这很优雅.我查看了Python文档,找不到类似的东西.我能想到的最好的是:
if (True in [t < 0 for t in x]):
# do something
Run Code Online (Sandbox Code Playgroud)
我发现这相当不优雅.有没有更好的方法在Python中执行此操作?
在python docs页面中any,any()函数的等效代码如下:
def any(iterable):
for element in iterable:
if element:
return True
return False
Run Code Online (Sandbox Code Playgroud)
如果以这种形式调用它,这个函数如何知道我想测试哪个元素?
any(x > 0 for x in list)
Run Code Online (Sandbox Code Playgroud)
从函数定义中,我只能看到我传递的是一个可迭代对象.for循环如何知道我正在寻找什么> 0?
在python中,我有一个列表应该只有一个 truthy值(即,bool(value) is True).有没有一种聪明的方法来检查这个?现在,我只是遍历列表并手动检查:
def only1(l)
true_found = False
for v in l:
if v and not true_found:
true_found=True
elif v and true_found:
return False #"Too Many Trues"
return true_found
Run Code Online (Sandbox Code Playgroud)
这似乎不优雅,不是非常pythonic.有更聪明的方法吗?
说我有元组列表:
list = [(1,5), (1,7), (2,3)]
Run Code Online (Sandbox Code Playgroud)
有没有办法在Python中编写类似的东西
if (1, *) in list: do things
Run Code Online (Sandbox Code Playgroud)
在哪里*意味着" 我不关心这个价值 "?所以我们检查1第一个位置是否有元组,第二个位置是否有值.
据我所知,其他语言中有特殊机制,但我不知道这个特殊问题的名称.那么Python中有类似的行为吗?
PS:我知道我可以在这里使用列表推导.我对这个特殊机制感兴趣.
有一个类似的问题在这里,但在这一问题的用户似乎有一个更大的阵列,或载体。如果我有:
bool boolArray[4];
Run Code Online (Sandbox Code Playgroud)
我想检查所有元素是否为假,我可以分别检查[0],[1],[2]和[3],也可以循环遍历。由于(据我所知)false应该具有值0,而除0以外的其他任何东西都为true,所以我想到了简单地做:
if ( *(int*) boolArray) { }
Run Code Online (Sandbox Code Playgroud)
这行得通,但是我意识到它依赖于布尔值是一个字节,整数是四个字节。如果我强制转换为(std :: uint32_t)可以,还是一个坏主意?我刚好在一个数组中有3或4个布尔值,并且想知道这是否安全,如果不是,那么是否有更好的方法可以做到。
另外,如果我最终得到超过4个布尔值,但少于8个布尔值,那么我可以使用std :: uint64_t或unsigned long long之类的东西做同样的事情吗?
我all在Python中搜索了对该函数的理解,我发现了这个,根据这里:
allTrue只有当所有元素都是Truthy时才会返回.
但是当我使用这个函数时,它的表现不同:
'?' == True # False
'!' == True # False
all(['?','!']) # True
Run Code Online (Sandbox Code Playgroud)
为什么当输入中的所有元素都False返回时True?我误解了它的功能还是有解释?
all()在序列中找到 False 后是否立即返回 False?
尝试运行这段代码:
def return_true():
print('I have just been printed')
return True
print(all((False, return_true())))
Run Code Online (Sandbox Code Playgroud)
如您所见,I have just been printed即使前面有 False,也会打印出来。
另一个例子:
def return_false():
print('I have just been printed')
return False
print(any((True, return_false())))
Run Code Online (Sandbox Code Playgroud)
在这种情况下,I have just been printed即使之前有 True,也会在此代码中打印。