對 Python list遺憾
sum
對列表執行正確的操作幾乎是不可能的。
my_list = list(range(1, 100001))
能夠執行 sum()、min() 和 max() 的情況非常罕見。
sum(my_list)
5000050000
比如mean(), std() ,這些也不行。
mean(my_list)
---------------------------------------------------------------------------NameError Traceback (most recent call last)Cell In[4], line 1
----> 1 mean(my_list)NameError: name 'mean' is not defined
std(my_list)
---------------------------------------------------------------------------NameError Traceback (most recent call last)Cell In[5], line 1
----> 1 std(my_list)NameError: name 'std' is not defined
最后,別無選擇,只能使用 numpy 或 statistic。
import numpy as np
np.mean(my_list), np.std(my_list)
(50000.5, 28867.513458037913)
import statistics as st
st.mean(my_list), st.stdev(my_list)
(50000.5, 28867.657796687745)
順便說一下,np.std(my_list) 和 st.stdev(my_list) 是不同的,原因是通常的 ARE。
np.mean(my_list), np.std(my_list, ddof=1)
(50000.5, 28867.65779668774)
st.mean(my_list), st.pstdev(my_list)
(50000.5, 28867.513458037913)
如果做到的話…
希望它是 j,這樣它也可以進行一般的向量運算。
my_list = list(range(1, 6))
以下不會導致錯誤,但會執行不同的操作:重復列表 n 次。
a = my_list * 3
a
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
+ 的工作方式也不同。
my_list2 = list(range(11, 16))
my_list + my_list2
[1, 2, 3, 4, 5, 11, 12, 13, 14, 15]
如果是標量,+、-、/ 或 ** 將導致錯誤。
a = my_list + 2
---------------------------------------------------------------------------TypeError Traceback (most recent call last)Cell In[16], line 1
----> 1 a = my_list + 2TypeError: can only concatenate list (not "int") to list
a = my_list ** 2
---------------------------------------------------------------------------TypeError Traceback (most recent call last)Cell In[17], line 1
----> 1 a = my_list ** 2TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int'
好吧,如果可以直接說它是一個對列表類型執行指定操作的運算符就好了,但是在一致性方面就有點令人失望了。
我們是否應該將當前的 +、* 更改為 +++、***(因為 ** 是冪),就像最近引入的“海象運算符”一樣?
但是,如果你讓它的行為像 numpy.ndarray (除了會出現的混亂),那么“列表”的存在豈不是毫無意義?
列表類型的意義是什么?
我想是有的。