如何在列表中找到最长的列表?

15

给定一个列表的列表,可以使用以下代码找到最长列表的长度。

values = [['a','a'], ['a','b','b'], ['a','b','b','a'], ['a','b','c','a']]

longest = 0
for value in values:
    longest = max(longest, len(value))

print(longest)
[out]: 4

如何在不使用循环的情况下找到最长列表的长度或最长列表。

Translated:

How to find the length of the longest list or the longest list without using a loop.

3个回答

34

这将返回列表values中最长的列表:

max(values, key=len)

6
这将返回最长列表的长度:
max(map(len, values))

2
  • 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

# convert the list of lists to a dataframe
df = pd.DataFrame({'lists': values})

# display(df)
          lists
0        [a, a]
1     [a, b, b]
2  [a, b, b, a]
3  [a, b, c, a]

# create column for the length of each list
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

# select lists with max(len)
max_len = df[df.len == df.len.max()]  # or [df.len == some int] for a specific length

# display(max_len)
          lists  len
2  [a, b, b, a]    4
3  [a, b, c, a]    4

%timeit

import pandas as pd
import random
import string

# 1M sub-list of 1-15 characters
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)

# function to do all the pandas stuff for testing
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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接