为什么python中的列表不具有__dict__属性?

时间:2019-08-06 22:07:48

标签: python list time-complexity

为了降低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

我希望情况会如此 令我惊讶的是

2 个答案:

答案 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)时间中的列表包含。