说我有一个词典
{'longbutnotlongestpair1':['longbutnotlongestpair2' ,'longbutnotlongestpair3'], 'thisisshort1': ['thisisshort2'] , 'thisisthelongeststring1' : ['thisisthelongeststring2','thisisthelongeststring3'], 'thisisthelongeststring4' : ['thisisthelongeststring5','thisisthelongeststring6']}
我想找到最长的一对弦。
输出(我想要的):
['thisisthelongeststring2','thisisthelongeststring3']
['thisisthelongeststring5','thisisthelongeststring6']
这是我到目前为止所拥有的
for i in D.keys():
if max(D.keys(), key=len):
print(D[i])
显然有错误,
同样max()
也不起作用,因为它只会返回一个东西,而且我可能有两个或更多的最大值返回。
如何实现我想要的输出?
答案 0 :(得分:2)
您需要调整max
key
功能以更好地符合您的标准:
maximum_key = max(D, key=lambda k: sum(len(v) for v in D[k]))
print(D[maximum_key])
这里的密钥取D[k]
中所有长度的总和。如果要查找具有最长单字符串的一个值,请使用:
maximum_key = max(D, key=lambda k: max(len(v) for v in D[k]))
使用每个值的最大单字符串长度来查找最大键。
但是,如果您必须列出所有最长的对,则可以对键进行排序,然后选择具有相同字符串值长度的键。使用groupby
将有助于选出最长的密钥:
from itertools import groupby
key = lambda k: sum(len(v) for v in D[k])
maximum_keys = next(groupby(sorted(D, key=key, reverse=True), key=key))[1]
for max_key in maximum_keys:
print(D[max_key])
这会选择第一个组的键,按字符串长度反向排序,并为 提供所有长度相同的键。这是最大的密钥组,然后我们打印出来。
演示:
>>> from itertools import groupby
>>> D = {'longbutnotlongestpair1': ['longbutnotlongestpair2', 'longbutnotlongestpair3'], 'thisisshort1': ['thisisshort2'], 'thisisthelongeststring1': ['thisisthelongeststring2', 'thisisthelongeststring3'], 'thisisthelongeststring4': ['thisisthelongeststring5', 'thisisthelongeststring6']}
>>> key = lambda k: sum(len(v) for v in D[k])
>>> maximum_keys = next(groupby(sorted(D, key=key, reverse=True), key=key))[1]
>>> for max_key in maximum_keys:
... print(D[max_key])
...
['thisisthelongeststring2', 'thisisthelongeststring3']
['thisisthelongeststring5', 'thisisthelongeststring6']
这是合理的性能,但是如果你有一个非常大的字典和/或大值,你想要排序(O(NlogN)成本),或循环两次(一次获得最大值,一次打印值)
只需一个循环即可完成所有操作,以确定最大值:
max_values = []
max_length = 0
for value in D.values():
res = sum(len(s) for s in value)
if res > max_length:
max_length = res
max_values = [value]
elif res == max_length:
max_values.append(value)
for value in max_values:
print(value)
答案 1 :(得分:0)
sumlen = lambda x:sum([len(i) for i in x])
maximum = max([sumlen(i) for i in D.values()])
for i in D.values():
if sumlen(i)==maximum:
print i
然后你会得到最长的一对(保留所有,如果不只是一个):
['thisisthelongeststring2', 'thisisthelongeststring3']
['thisisthelongeststring5', 'thisisthelongeststring6']