我有对象列表.我想在这个列表中找到一个(第一个或任何)对象,它具有等于的属性(或方法结果 - 无论如何)value.
找到它的最佳方法是什么?
这是测试用例:
class Test:
def __init__(self, value):
self.value = value
import random
value = 5
test_list = [Test(random.randint(0,100)) for x in range(1000)]
# that I would do in Pascal, I don't believe isn't anywhere near 'Pythonic'
for x in test_list:
if x.value == value:
print "i found it!"
break
Run Code Online (Sandbox Code Playgroud)
我认为使用生成器并reduce()没有任何区别,因为它仍然会遍历列表.
ps:方程式value只是一个例子.当然我们想要得到满足任何条件的元素.
我一直无法找到这些信息的来源,除了自己查看Python源代码以确定对象的工作方式.有谁知道我在哪里可以找到这个?
我写了一个简单的Eratosthenes筛子,它使用了一个列表,如果不是素数则将它们变成零,如下:
def eSieve(n): #Where m is fixed-length list of all integers up to n
'''Creates a list of primes less than or equal to n'''
m = [1]*(n+1)
for i in xrange(2,int((n)**0.5)+1):
if m[i]:
for j in xrange(i*i,n+1,i):
m[j]=0
return [i for i in xrange(2,n) if m[i]]
Run Code Online (Sandbox Code Playgroud)
我测试了它运行的速度%timeit并获得:
#n: t
#10**1: 7 ?s
#10**2: 26.6 ?s
#10**3: 234 ?s
#10**4: 2.46 ms
#10**5: 26.4 ms
#10**6: 292 ms
#10**7: 3.27 s
Run Code Online (Sandbox Code Playgroud)
我假设,如果我改变[1]并且0使用布尔值,它会跑得更快......但它恰恰相反:
#n: t …Run Code Online (Sandbox Code Playgroud) 在Python中,我们知道在字典中查找键需要O(1)的运行时间,但在dictionary.values()中查找的运行时间是多少?
dictionary = {'a':[66,77,88], 'b':[99,100]}
key = 'a'
if key in dictionary: # takes O(1) run time
number = '99'
if number in dictionary.values(): # What is the run time here?
Run Code Online (Sandbox Code Playgroud)
编辑#1:键的值可以是列表或集合。许多人回答说,如果列出值,则运行时间为O(1)。
如果设置了值,它将是O(N)吗?
dictionary = {'a':(66,77,88), 'b':(99,100)}
number = '99'
if number in dictionary.values(): # What is the run time here?
Run Code Online (Sandbox Code Playgroud) 我正在制作一个国际象棋引擎,对于我的方块表,我可以使用列表或词典.由于方块表的实现使引擎慢了两倍,我想知道我是否使用了错误的数据结构.我正在使用列表,但我想知道字典是否是一个更好的主意?
列表示例:
list_ex = [50, 30, 30, 30
20, 30, 50, 40]
call = list_ex[2]
Run Code Online (Sandbox Code Playgroud)
字典示例:
dict_ex = {0: 50, 1: 30, 2: 30, 3: 30,
4: 20, 5: 30, 6: 50, 7: 40}
call = dict_ex[2]
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我总是知道索引,我只需要返回与该索引相关的值.对于这个词典或列表,哪种数据结构会更快?
我正在尝试编写一个程序来确定特定的牌照是否是我存储的10,000个牌照之一.我想首先编写一个快速响应算法,将内存使用作为次要目标.平衡的二叉搜索树或哈希表是否足以存储10,000个车牌号码(也包含字母)?
根据https://wiki.python.org/moin/TimeComplexity给出的字典D,操作
D[k]是恒定的。
的复杂度是k in D多少?这还是不变的吗?
我知道列表与数组不同.但是,O(1)?这意味着访问列表中的元素与访问dict中的元素一样快,我们都知道这不是真的.我的问题是基于这份文件:
Run Code Online (Sandbox Code Playgroud)list ---------------------------- | Operation | Average Case | |-----------|--------------| | ... | ... | |-----------|--------------| | Get Item | O(1) | ----------------------------
而这个答案:
列表中的查找是O(n),字典中的查找是分摊的O(1),关于数据结构中的项目数.
如果第一个文档是真的,那么为什么访问一个dict比访问列表更快,如果它们具有相同的复杂性?
有人可以对此作出明确的解释吗?我会说它总是取决于列表/字典的大小,但我需要更多的洞察力.
我是python的新手,我有一个问题.在这个脚本中,我重命名字符串的元素.对于小输入z <1mb的文本文件时间很短.如果我尝试输入超过2Mb,则需要超过1小时.
是字典造成的时间问题吗?我应该尝试通过列表或设置来接近吗?我已经看过这篇文章Python:List vs Dict查找有关dicts优于列表的查找表.我有点困惑.
我的一个项目中有一个情况,我可以使用列表或字典,我很难选择使用哪一个.
我正在分析大量的项目(> 400k).我会有(> 400k)列表或词典,我将经常使用.(获取/设置/更新)
在我的特殊情况下,如果我根本不考虑性能,使用字典感觉比列表更方便.但是,我知道我可以管理使用列表编写相同的东西.
我是否应该寻求可读性并使用字典或使用字典可能会增加太多的开销,这会从内存和时间的角度大大降低我的性能.
我知道这个问题有点过于宽泛.但是在完成这个决定之后我开始构建我的所有逻辑之前我想问它.
我的情况简而言之:
我有钥匙的价值0,1,...,n.现在,密钥将始终从整数0到n,我可以保持在列表中.
但是,我可以想到将来可能出现的一些情况,我需要保留一些不是整数的键的项目.或者不是连续的整数.
所以,问题是如果首先使用字典而不是列表不会增加大量的内存/时间成本,我将首先使用字典.但是,我不确定有> 400k字典与> 400k列表在性能方面有很大差异.
python ×10
dictionary ×4
performance ×3
big-o ×2
list ×2
python-2.7 ×2
boolean ×1
cpython ×1
django ×1
hashmap ×1
hashtable ×1
optimization ×1
sequences ×1