Python 确定列表中列的最长字符串长度的最快方法
我有一个包含5000个键的字典,这些键的值是列表,我需要快速确定所有字典值中给定索引的最长字符串的长度Python 确定列表中列的最长字符串长度的最快方法,python,string,dictionary,Python,String,Dictionary,我有一个包含5000个键的字典,这些键的值是列表,我需要快速确定所有字典值中给定索引的最长字符串的长度 index = 1 d = {'foo': ['abc', 'defg'], 'bar': ['hij', 'klmno']} #m = len(max(d.values()[index],key=len))? 预期输出:5,因为索引1中的所有值('defg'和'klmno',后者最长)。非常接近,只需使用生成器表达式迭代列表中的所有项即可 print max(len(max(d[
index = 1
d = {'foo': ['abc', 'defg'],
'bar': ['hij', 'klmno']}
#m = len(max(d.values()[index],key=len))?
预期输出:
5
,因为索引1中的所有值('defg'
和'klmno',后者最长)。非常接近,只需使用生成器表达式迭代列表中的所有项即可
print max(len(max(d[i],key=len)) for i in d)
非常接近,只需要使用生成器表达式来迭代列表中的所有项
print max(len(max(d[i],key=len)) for i in d)
您需要使用生成器表达式来提取正确的索引:
longest_string = len(max((row[index] for row in d.values()), key=len))
如果您只需要长度,而不是字符串本身,那么还可以在生成器表达式中获取长度:
highest_length = max(len(row[index]) for row in d.values())
演示:
但是,您无法避免必须迭代字典中的所有值。您需要使用生成器表达式来提取正确的索引:
longest_string = len(max((row[index] for row in d.values()), key=len))
如果您只需要长度,而不是字符串本身,那么还可以在生成器表达式中获取长度:
highest_length = max(len(row[index]) for row in d.values())
演示:
但是,您无法避免必须迭代字典中的所有值。首先,使用列表提取所有感兴趣的字符串:
xs = [v[index] for v in d.values()]
接下来,将max带到琴弦的镜头上:
print(max(map(len, xs)))
首先,使用列表提取所有感兴趣的字符串:
xs = [v[index] for v in d.values()]
接下来,将max带到琴弦的镜头上:
print(max(map(len, xs)))
注释代码(应该是
len(max(d[index],key=len))
有什么问题?如果您正在查找特定的键,那么字典中有多少键又有什么关系呢?Python dict查找时间是O(1)@DeepSpace注释掉的代码的问题是“d.values()[index]”无效(Py3)或没有达到预期效果(Py2)。@MathiasRav当然没有做到:)len(max(d[index],key=len))
您是在询问该字符串的长度,还是字符串本身?还有,您的预期输出应该是4
,而不是5
。注释的代码(应该是len(max(d[index],key=len))
有什么问题?如果您正在查找特定的键,那么字典中有多少键又有什么关系呢?Python dict查找时间是O(1)@DeepSpace注释掉的代码的问题是“d.values()[index]”无效(Py3)或没有达到预期效果(Py2)。@MathiasRav当然没有做到:)len(max(d[index],key=len))
您是在询问该字符串的长度,还是字符串本身?还有,您的预期输出应该是4
,而不是5
。我没有否决您的答案,但这不是一个列表。这是一个发电机。@HugoSadok谢谢,那是一个精神错乱。谢谢更新。首先从每个列表中获取最大值,然后从这些结果中获取最大值。OP试图从给定列中获取最大值,由索引@MartijnPieters表示。哦,我没有否决你的答案,但这不是一个列表。这是一个发电机。@HugoSadok谢谢,那是一个精神错乱。谢谢更新。首先从每个列表中获取最大值,然后从这些结果中获取最大值。OP试图从给定列中获取最大值,该列由index
@MartijnPieters表示。为什么首先创建一个完整的列表对象?请改用生成器表达式。另外,为什么不将len()
调用放入值xs
输出中,为什么还要添加map()
?实际上,使用生成器表达式可能更快。创建一个列表允许OP在REPL处检查计算。剥猫皮的方法不止一种。如果速度或空间使用是一个问题,记得根据真实的输入(也就是说,根据OP的用例是真实的,我们不知道)。为什么要先创建一个完整的列表对象?请改用生成器表达式。另外,为什么不将len()
调用放入值xs
输出中,为什么还要添加map()
?实际上,使用生成器表达式可能更快。创建一个列表允许OP在REPL处检查计算。剥猫皮的方法不止一种。如果速度或空间使用是一个问题,请记住根据真实的输入进行配置(即,根据OP的用例进行真实的配置,我们不知道)。