Python:查找字典中最长的对字符串(值)?

时间:2013-12-19 12:01:06

标签: python dictionary

说我有一个词典

{'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()也不起作用,因为它只会返回一个东西,而且我可能有两个或更多的最大值返回。

如何实现我想要的输出?

2 个答案:

答案 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']