为了降低python中的时间复杂度:
if value in list:
# Do something
您可以使python列表具有__dict__
属性,该列表的每个值都作为键,而dict中的每个值都为1
,以使检查值是否在列出O(1)
。
例如,列表的__dict__
属性:
["Hello", "World", "This", "Is", "An", "Example"]
会是这样的:
{"Hello": 1, "World": 1, "This": 1, "Is": 1, "An": 1, "Example": 1}
我尝试使用python访问列表的__dict__
属性,它给了我AttributeError
。
我希望情况会如此 令我惊讶的是
答案 0 :(得分:2)
您可以通过使用套件获得想要的东西。
>>> "Hello" in {"Hello", "World", "This", "Is", "An", "Example"}
True
您将获得O(1)查找,因为集和字典被实现为哈希表。这要求字典中的所有键或集合中的值都是不可变且可哈希的。 Python列表更灵活。值可以是可变的,它们可以是其他列表,甚至可以具有循环引用。
如果每个列表都有一个内置的哈希表,则将有很大的性能和内存成本。因此,如果要进行快速成员资格测试,请使用一组。
如果您已经有了列表,则可以轻松地将其转换为集合:
>>> my_list = list('hello world')
>>> set(my_list)
{'h', 'd', 'w', 'e', 'r', 'o', 'l', ' '}
>>> {*my_list}
{'h', 'd', 'w', 'e', 'r', 'o', 'l', ' '}
(在集合常量中用*
解开可迭代项需要python 3.5)
答案 1 :(得分:0)
因为在软件工程中没有免费的东西。获取O(1)查找是有代价的。
Python字典实现为哈希表,而Python列表实际上是动态数组。您的实现将强制每个python列表维护一个哈希表和一个动态数组,因为它需要跟踪列表的顺序。
哈希表本质上是通过浪费空间来实现O(1)查找。使用哈希表时,您在交换空间以提高速度。您的哈希表中可能只有100个项目,但它却占用了100个以上的项目,可能增加了2倍-不管怎么说,常数都会更多。但是您会得到O(1)查找...因此,如果您更关心O(1)查找而不是浪费内存,那么这是一个不错的选择。如果您根本不关心O(1)查找,那将是一个坏交易。
您不想在所有情况下都这样做,因为在许多情况下,您都不关心测试O(1)时间中的列表包含。