我问这个是因为我知道检查列表是否为空的pythonic方法如下:
my_list = []
if not my_list:
print "computer says no"
else:
# my_list isn't empty
print "computer says yes"
Run Code Online (Sandbox Code Playgroud)
将打印computer says no,等等,这使我认识[]到False真值; 但是,如果我尝试直接比较[]和False,我会得到以下结果:
>>> my_list == False
False
>>> my_list is False
False
>>> [] == False
False
Run Code Online (Sandbox Code Playgroud)
等等...
这里发生了什么?我觉得我错过了一些非常明显的东西.
我正在使用列表列表 - 让我们称之为L- 在R中,其中子列表的长度都相同并且用NA填充.理想情况下,我想从每个子列表中删除NA元素,我想出的一个解决方案是L <- lapply(L, na.omit).它似乎几乎可以工作; 但是,对于每个子列表,行为都是这样的,例如,
[[1]]
[1] "0" "12345" "12346" "12347" "12348" "12349" "12340" "12341" "12342" NA NA NA NA NA NA
[16] NA NA NA NA NA NA NA NA NA NA NA
Run Code Online (Sandbox Code Playgroud)
变
[[1]]
[1] "0" "12345" "12346" "12347" "12348" "12349" "12340" "12341" "12342"
attr(,"na.action")
[1] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
attr(,"class")
[1] "omit"
Run Code Online (Sandbox Code Playgroud)
我有点困惑,说实话 - attr() …
我刚才看到Alex Martelli今晚展示了这一点.我没有理解为什么这里存在如此大的速度差异,而且我仍然很好奇:
% python -mtimeit -s'def f(): pass' 'f()'
10000000 loops, best of 3: 0.121 usec per loop
% python -mtimeit -s'def f(): pass' 'f'
10000000 loops, best of 3: 0.0265 usec per loop
Run Code Online (Sandbox Code Playgroud)
那么为什么f跑得比这快得多f()呢?不可否认,这个例子有点人为,因为我不知道它是否会推广到所有不带参数的函数.引擎盖下发生了什么?