在python中获取字符串/列表中的第三大单词

2024-09-30 04:36:43 发布

您现在位置:Python中文网/ 问答频道 /正文

对于下面的代码,我似乎找不到第三大字。我将从用户输入中得到的字符串拆分并放入“words”变量中,然后创建两个列表,其中一个列表包括按长度排序的单词。你知道吗

然后我得到最长单词的长度(在maxlist)和第二长单词的长度(在maxlist2)并删除它们。剩下的应该是原来列表中第三长的单词和任何较短的单词。但我发现这不太管用。你知道吗

下面的第二个和第三个"for"语句似乎并没有删除由"maxlist"表示的wordlength的所有实例

例如,如果我仅用字母“e”来表示单词,并对不同的字长使用不同的e的数字(即ee,eeee,eeee),那么这些实例中的一些会被“For”语句删除,而另一些则不会。对于此输入: "e ee eee eeee eeee eeee eeee eeee eeee eeee eeee"我希望所有“eeee”单词都被代码删除:

 if len(word) == maxlist:
            sort2.remove(word)

如果我为下一个最长的单词重复代码(这是由第三个“for”语句完成的),我还应该删除“eee”实例。但是它们不会被删除,最终的列表仍然是"'e', 'ee', 'eee', 'eeee', 'eeee'"

第二个"for"语句似乎删除了"eeee"的6个实例,但不是全部8个实例。这里怎么了?请帮忙!!你知道吗

我的最终输出应该是原始列表中第三长的单词+任何较短的单词。你知道吗

def ThirdGreatest(strArr):

    words = strArr.split()
    sort=[] # length of words
    sort2=[] # actual words
    for word in words:
        sort2.append(word)
        sort.append(len(word))
        sort2.sort()

    maxlist= len(max(sort2, key=len)) 
    for word in sort2:
        if len(word) == maxlist:
            sort2.remove(word)

    maxlist2 = len(max(sort2, key=len))
    for word in sort2:
        if len(word) == maxlist2:
            sort2.remove(word)

    maxlist3 = (max(sort2, key=len))

    print 
    print "biggest word is {} char long ".format(maxlist) 
    print sort
    print "3rd biggest word is {}: ".format(maxlist3)
    print "3rd biggest word is {}: ".format(sort2) # list of words remaining       
    #after the first 2 longest have been removed


ThirdGreatest(raw_input("Enter String: ")) 

Tags: 实例代码列表forlen语句sort单词
3条回答

您应该使用^{}来查找第三大:

third_largest = heapq.nlargest(3, set(words))[-1]

之后,你可以使用各种各样的东西,例如列表理解:

[word for word in words if word != third_largest]

您的问题是:

for word in sort2:
    if len(word) == maxlist:
        sort2.remove(word)

不要更改当前正在迭代的列表,那样只会把事情搞砸。就像你在读一本书,有人在你读的时候撕掉了书页。你知道吗

迭代副本:

for word in sort2[:]:
    if len(word) == maxlist:
        sort2.remove(word)

请注意添加的[:],它将为您提供一个副本。你知道吗


以及一个替代解决方案:

[next(g) for _, g in groupby(sorted(words, key=len), len)][-3]

演示:

>>> words = 'This is a test and I try hard to make it good'.split()
>>> from itertools import groupby
>>> [next(g) for _, g in groupby(sorted(words, key=len), len)][-3]
'is'

这是我最初的、冗长而繁琐的解决方案,但其他用户发布了更简洁和清晰的答案。谢谢你们。你知道吗

定义第三个创建(strArr): 字数=斯特拉尔·斯普利特() 排序=[]#字长 sort2=[]#实际单词

for word in words:
    sort2.append(word)
    sort.append(len(word))

sort3=set(sort2)
sorted_set3= sorted(sort3, key=len)
sort4 =[]
for n in sorted_set3:
    sort4.append(n)

maxlist= len(max(sort4, key=len)) 
for word in sort4:
    if len(word) == maxlist:
        sort4.remove(word)

maxlist2 = len(max(sort4, key=len))
for word in sort4:
    if len(word) == maxlist2:
        sort4.remove(word)
print "_______________________________________________________________"
print "The third largest word is: {} ".format(max(sort4, key=len))

ThirdGreatest(原始输入(“输入字符串:”))

相关问题 更多 >

    热门问题