- blhsing 的 答案 很适合查找第一个最长的子列表,而且速度快。
- 对于一个由1M个长度在1-15之间变化的列表组成的列表,它只需要29.6毫秒就能返回具有最大长度的第一个列表。
values = [['a','a'], ['a','b','b'], ['a','b','b','a'], ['a','b','c','a']]
max(values, key=len)
[out]:
['a', 'b', 'b', 'a']
- 这个
pandas
解决方案并不是为了在速度上与被接受的答案竞争,寻找第一个最长的列表。
- 有很多人使用
pandas
进行分析,所以从这个角度来看,这是一个有效的问题。
- 这个解决方案用于返回所有最大列表长度或指定长度的子列表。
- 可以用一个
int
代替 df.len.max()
,来返回指定长度的列表。
- 这个解决方案利用了 pandas:布尔索引。
- 虽然这个解决方案速度较慢,但它返回了不同的结果。
- 必须将列表加载到 pandas 中
- 创建了名为
'len'
的列
- 布尔掩码用于返回所有匹配的列表
- 对于一个包含 1M 个列表、长度从 1-15 不等的列表,需要 682 毫秒才能返回所有具有最大(或指定)长度的列表。
- 值得注意的是,可以在
pandas.Series
上使用 max(df.lists, key=len)
找到第一个最长的列表。
import pandas as pd
df = pd.DataFrame({'lists': values})
lists
0 [a, a]
1 [a, b, b]
2 [a, b, b, a]
3 [a, b, c, a]
df['len'] = df.lists.map(len)
lists len
0 [a, a] 2
1 [a, b, b] 3
2 [a, b, b, a] 4
3 [a, b, c, a] 4
max_len = df[df.len == df.len.max()]
lists len
2 [a, b, b, a] 4
3 [a, b, c, a] 4
%timeit
import pandas as pd
import random
import string
l = [random.sample(string.ascii_letters, random.randint(1, 15)) for _ in range(10**6)]
%timeit max(l, key=len)
29.6 ms ± 1.74 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
def get_max_len(l):
df = pd.DataFrame({'lists': l})
df['len'] = df.lists.map(len)
return df[df.len == df.len.max()]
%timeit get_max_len(l)
682 ms ± 14.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)