我看到人们正在使用any收集另一个列表来查看列表中是否存在某个项目,但是有一个快速的方法可以做到吗?:
if list.contains(myItem):
# do something
Run Code Online (Sandbox Code Playgroud) 如果我有一个字符串数组,我可以检查一个字符串是否在数组中而不进行for循环?具体来说,我正在寻找一种方法在一个if语句中这样做,所以像这样:
if [check that item is in array]:
Run Code Online (Sandbox Code Playgroud) 是否有一个库函数在列表/元组上执行二进制搜索并返回项目的位置(如果找到)和'False'(-1,None等),如果没有?
我在bisect模块中找到了函数bisect_left/right ,但即使该项不在列表中,它们仍会返回一个位置.这对于他们的预期用途来说非常好,但我只是想知道一个项目是否在列表中(不想插入任何内容).
我想过使用bisect_left然后检查那个位置的项目是否等于我正在搜索的项目,但这看起来很麻烦(我还需要检查边界是否可以大于我列表中的最大数字).如果有一个更好的方法我想知道它.
编辑为了澄清我需要这个:我知道字典非常适合这个,但我试图尽可能降低内存消耗.我的预期用法是一种双向查找表.我在表中有一个值列表,我需要能够根据它们的索引访问这些值.而且如果值不在列表中,我希望能够找到特定值的索引或None.
使用字典是最快的方法,但会(大约)加倍内存需求.
我在问这个问题,认为我可能忽略了Python库中的某些东西.正如Moe建议的那样,我似乎必须编写自己的代码.
相关的IEEE标准定义了一个数字常量NaN(不是数字),并规定NaN应该比较为不等于它自己.这是为什么?
我熟悉的所有语言都实现了这个规则.但它经常会导致严重的问题,例如当NaN存储在容器中时,NaN存在于正在排序的数据中等时的意外行为等.更不用说,绝大多数程序员都希望任何对象都等于自身(在他们了解NaN之前,令人惊讶的是他们增加了错误和混乱.
IEEE标准经过深思熟虑,因此我确信NaN的比较与其本身相同是很糟糕的.我只是想不通它是什么.
我想知道list_1中包含哪些元素list_2。我需要输出作为布尔值的有序列表。但我想避免for循环,因为两个列表都有超过 200 万个元素。
这就是我所拥有的并且它有效,但它太慢了:
list_1 = [0,0,1,2,0,0]
list_2 = [1,2,3,4,5,6]
booleans = []
for i in list_1:
booleans.append(i in list_2)
# booleans = [False, False, True, True, False, False]
Run Code Online (Sandbox Code Playgroud)
我可以拆分列表并使用多线程,但如果可能的话,我更喜欢更简单的解决方案。我知道像 sum() 这样的一些函数使用向量运算。我正在寻找类似的东西。
如何让我的代码更加高效?
我使用字典作为查找表,但我开始怀疑列表是否会更适合我的应用程序 - 查找表中的条目数量不是那么大.我知道列表在引擎盖下使用C数组,这使我得出结论,在列表中只查找几个项目比在字典中更好(访问数组中的一些元素比计算哈希更快).
我决定介绍其他选择,但结果让我感到惊讶.列表查找只有单个元素才能更好!请参见下图(log-log plot):
所以问题就出现了:为什么列表查找执行得如此糟糕?我错过了什么?
在一个侧面问题上,在大约1000个条目之后,在dict查找时间中引起我注意的其他东西是一个小"不连续".我单独绘制了dict查找时间来显示它.
ps1我知道数组和散列表的O(n)vs O(1)摊销时间,但通常情况下,迭代数组的少量元素比使用散列表更好.
ps2这是我用来比较字典和列表查找时间的代码:
import timeit
lengths = [2 ** i for i in xrange(15)]
list_time = []
dict_time = []
for l in lengths:
list_time.append(timeit.timeit('%i in d' % (l/2), 'd=range(%i)' % l))
dict_time.append(timeit.timeit('%i in d' % (l/2),
'd=dict.fromkeys(range(%i))' % l))
print l, list_time[-1], dict_time[-1]
Run Code Online (Sandbox Code Playgroud)
ps3使用Python 2.7.13
假设我有一个数组= [0,8,5]
知道8是否在这个内部的最快方法是什么...例如:
if(array.contain(8)){
// return true
}
Run Code Online (Sandbox Code Playgroud)
我发现了这个:检查列表中是否存在值的最快方法(Python)
而这:检测Javascript中的值是否在一组值中的最快方法
但这不能回答我的问题.谢谢.
可能重复:
Python FAQ:"异常有多快?"
我记得读过Python在异常方面实现了"更好地寻求宽恕而非要求许可"的哲学.根据作者的说法,这意味着Python代码应该使用大量的try - except子句,而不是试图提前确定是否要做一些会导致异常的事情.
我刚刚在我的网络应用程序上写了一些try - except子句,其中大部分时间都会在代码运行时引发异常.因此,在这种情况下,提高和捕获异常将是常态.从效率的角度来看这是不是很糟糕?我还记得有人告诉我,捕获一个引发异常会产生很大的性能开销.
使用try - except条款是否会不必要地低效,在这些条款中,您希望几乎所有时间都会引发异常?
这是代码 - 它使用Django ORM来检查将用户与各种第三方社交提供者相关联的对象.
try:
fb_social_auth = UserSocialAuth.objects.get(user=self, provider='facebook')
user_dict['facebook_id'] = fb_social_auth.uid
except ObjectDoesNotExist:
user_dict['facebook_id'] = None
try:
fs_social_auth = UserSocialAuth.objects.get(user=self, provider='foursquare')
user_dict['foursquare_id'] = fs_social_auth.uid
except ObjectDoesNotExist:
user_dict['foursquare_id'] = None
try:
tw_social_auth = UserSocialAuth.objects.get(user=self, provider='twitter')
user_dict['twitter_id'] = tw_social_auth.uid
except ObjectDoesNotExist:
user_dict['twitter_id'] = None
Run Code Online (Sandbox Code Playgroud)
第一个将很少采取例外,因为现在我们正在实施"登录Facebook"作为新用户加入该网站的主要方法.但是,Twitter和Foursquare是可选的,如果他们想要导入朋友或粉丝,我希望大多数人不会.
我愿意接受更好的方法来编写这种逻辑.
我有一个名为的列表list_of_strings,如下所示:
['a', 'b', 'c', 'a', 'd', 'c', 'e']
Run Code Online (Sandbox Code Playgroud)
我想按一个值(在本例中为c)拆分此列表。我也想保留c由此产生的分裂。
所以预期的结果是:
[['a', 'b', 'c'], ['a', 'd', 'c'], ['e']]]
Run Code Online (Sandbox Code Playgroud)
有什么简单的方法可以做到这一点?
我想知道我们是否可以断言列表中的所有元素都不是None,因此 whilea = None会引发错误。
样本清单是[a, b, c]
我已经尝试过了,如果任何一个元素不是,assert [a, b, c] is not None它就会返回,但不会验证所有元素。你能帮忙想一下吗?谢谢!!TrueNone
python ×8
performance ×3
arrays ×2
contains ×2
list ×2
assert ×1
big-o ×1
bisection ×1
collections ×1
for-loop ×1
ieee-754 ×1
javascript ×1
nan ×1
optimization ×1
search ×1
try-catch ×1