Python 列表中超过1个最长字符串?

Python 列表中超过1个最长字符串?,python,python-3.x,Python,Python 3.x,我有一份美国各州的名单 states = ['Oklahoma', 'Kansas', 'North Carolina', 'Georgia', 'Oregon', 'Mississippi', 'Minnesota', 'Colorado', 'Alabama', 'Massachusetts', 'Arizona', 'Connecticut', 'Montana', 'West Virginia', 'Nebraska', 'New York', 'Ne

我有一份美国各州的名单

states = ['Oklahoma', 'Kansas', 'North Carolina', 'Georgia', 'Oregon',
      'Mississippi', 'Minnesota', 'Colorado', 'Alabama',
      'Massachusetts', 'Arizona', 'Connecticut', 'Montana',
      'West Virginia', 'Nebraska', 'New York', 'Nevada', 'Idaho',
      'New Jersey', 'Missouri', 'South Carolina', 'Pennsylvania',
      'Rhode Island', 'New Mexico', 'Alaska', 'New Hampshire',
      'Tennessee', 'Washington', 'Indiana', 'Hawaii', 'Kentucky',
      'Virginia', 'Ohio', 'Wisconsin', 'Maryland', 'Florida',
      'Utah', 'Maine', 'California', 'Vermont', 'Arkansas', 'Wyoming',
      'Louisiana', 'North Dakota', 'South Dakota', 'Texas',
      'Illinois', 'Iowa', 'Michigan', 'Delaware']
我想在这个项目列表中找到最长的字符串,这很容易做到:

def longest_state(data):
    return(max(states,key=len))
print(longest_state(states)
返回长度为14的“North Carolina”。不过,“南卡罗来纳州”也有14个,但没有被退回


我尝试使用下面的stackoverflow线程,它有一个示例,使用列表理解查找多个最长的字符串,但我无法使其工作。。。

我还尝试使用if/else语句将列表项附加到另一个变量,如果它等于当前最长项的长度,但没有成功


有人能帮忙吗?

您可以将所有最长的名称存储在一个数组中

def longest_state(data):
    cur_longest = []
    cur_longest_num = 0
    for state in data:
        if len(state) == cur_longest_num:
            cur_longest.append(state)
        elif len(state) > cur_longest_num:
            cur_longest = [state]
            cur_longest_num = len(state)
    return cur_longest

您可以将所有最长的名称存储在一个数组中

def longest_state(data):
    cur_longest = []
    cur_longest_num = 0
    for state in data:
        if len(state) == cur_longest_num:
            cur_longest.append(state)
        elif len(state) > cur_longest_num:
            cur_longest = [state]
            cur_longest_num = len(state)
    return cur_longest

在以下长度中键入一个dict:

>>> from collections import defaultdict
>>> len2states = defaultdict(list)
>>> for state in states:
...     len2states[len(state)].append(state)
...     
>>> len2states[max(len2states)]
['North Carolina', 'South Carolina']

在以下长度中键入一个dict:

>>> from collections import defaultdict
>>> len2states = defaultdict(list)
>>> for state in states:
...     len2states[len(state)].append(state)
...     
>>> len2states[max(len2states)]
['North Carolina', 'South Carolina']
希望这有帮助。 两通法,可能不是最好的。但肯定是O(n)

1次传球最好,但这看起来更短。

希望这有帮助。
longest_state = max(states, key=len)

for i in states:
    if len(i) == len(longest_state):
        print(i)
两通法,可能不是最好的。但肯定是O(n)

1次传球最好,但这看起来更短

longest_state = max(states, key=len)

for i in states:
    if len(i) == len(longest_state):
        print(i)
替代格式

longest_state = max(states, key=len)

[[print(i)] for i in states if len(i) == len(longest_state)]
替代格式

longest_state = max(states, key=len)

[[print(i)] for i in states if len(i) == len(longest_state)]

另一个潜在的解决方案。又短又甜

def longest_state(data):
    return [state for state in data if len(state) == len(max(data, key=len))]

另一个潜在的解决方案。又短又甜

def longest_state(data):
    return [state for state in data if len(state) == len(max(data, key=len))]

这个问题让我想知道,在所有可能的解决方案中,哪一个性能最好,所以我将所有出现在我脑海中但尚未发布的方案进行了比较,并将它们与我的方案进行了比较

groupby
方法:
groupby
需要一个排序的列表才能正常工作,因此事先对列表进行排序会带来“开销”,但大多数Python解释器都对排序算法进行了大量优化。我们使用
next
在第一个组出现时停止生成器,因此它不会继续提取剩余的项

takewhile
方法: 这还需要一个排序的列表,以及第一项的长度,但一旦lambda期望值不再满足,它就会停止收集新列表

reduce
方法: 这需要一个方法来处理前一个长度和排序列表之间的比较。它的所有长度比较以及将列表从lambda移动到lambda都使得这种方法效率低下

这个问题的其他答案 我在测试中包括了其他答案(来自各种海报的
max
len
,以及@Spencer Bard's、@Wim's和在每次比较中进行max扫描的其他列表理解),并比较了它们的性能

结果 当然,结果变化很大,但反复进行(repl.it上的样本量为50_000),我可以说它们具有代表性(让它们在我的cPython 3.5上运行几次):

结论 这里多次发布的
max
len
方法占据了一席之地,而且可能是最具python风格的方法,因为它不需要借助列表排序或使用
itertools
functools
集合
库就可以不言自明


这个问题让我想知道所有可能的解决方案中哪一个会有最好的性能,所以我对所有我想到但尚未发布的解决方案进行了比较,并将它们与我的进行了比较

groupby
方法:
groupby
需要一个排序的列表才能正常工作,因此事先对列表进行排序会带来“开销”,但大多数Python解释器都对排序算法进行了大量优化。我们使用
next
在第一个组出现时停止生成器,因此它不会继续提取剩余的项

takewhile
方法: 这还需要一个排序的列表,以及第一项的长度,但一旦lambda期望值不再满足,它就会停止收集新列表

reduce
方法: 这需要一个方法来处理前一个长度和排序列表之间的比较。它的所有长度比较和从lambda移动到lambda的列表都使得这是一种非有效的方法

这个问题的其他答案 我在测试中包括了其他答案(来自各种海报的
max
len
,以及@Spencer Bard's、@Wim's和在每次比较中进行max扫描的其他列表理解),并比较了它们的性能

结果 当然,结果变化很大,但反复进行(repl.it上的样本量为50_000),我可以说它们具有代表性(让它们在我的cPython 3.5上运行几次):

结论 这里多次发布的
max
len
方法占据了一席之地,而且可能是最具python风格的方法,因为它不需要借助列表排序或使用
itertools
functools
集合
库就可以不言自明


“但我无法让它工作”如何?你是怎么尝试的?您得到了什么错误/输出?
longest=[state from states if len(state)=14]
应该删除所有较短的错误/输出。不要重新计算列表comp中的最长长度,它将为每个元素重新计算最长的长度。“但我无法使其工作”如何?你是怎么尝试的?您得到了什么错误/输出?
longest=[state from states if len(state)=14]
应该删除所有较短的错误/输出。不要在列表comp中重新计算最长的长度,它将为每个元素重新计算最长的长度。@DeepSpace这并不“复杂”目前为止,它比其他解决方案更具优势,因为它只需要对输入进行一次扫描。@PatrickHaugh这里还有其他方法只对输入进行一次迭代。是的,我希望只对列表进行一次迭代。我还认为这个冗长的回答会对提问的人有所帮助
max and len 50_000 times: 1.3888958770003228
sort and groupby 50_000 times: 1.405984859000455
sort and takewhile 50_000 times: 1.4154430249991492
spencer 50_000 times: 1.607105290000618
wim 50_000 times: 1.9011182049998752
sort and reduce 50_000 times: 4.612968634999561
comprehension 50_000 times: 27.802522705999763