如何更改我的函数以允许在不重复代码的情况下查找最长和最短的字符串?

问题描述 投票:0回答:5

我正在用Python编写一个程序来查找数组中最短和最长的字符串,例如,这是find_shortest

def find_shortest(words):
 
    N = len(words)
    shortest = words[0]
    i = 1
    while i < N:
        if len(shortest) >= len(words[i]): #Change only this line for find_longest
            shortest = words[i]
        i += 1

    return shortest

我的问题是 find_longest 函数与 find_shortest 函数相同,只是 find_longest 使用 <= sign instead of >=。我不想复制粘贴 find_shortest 函数来制作 find_longest 但我别无选择。在这种情况下如何避免复制粘贴和冗余?

python function copy-paste redundancy
5个回答
0
投票

您可以根据函数所处的“模式”创建一个比较函数来使用

def find(words, mode):
    compare = (lambda x, y: x >= y) if mode == 'shortest' else (lambda x, y: x <= y)
    N = len(words)
    result = words[0]
    i = 1
    while i < N:
        if compare(len(result), len(words[i])):
            result = words[i]
        i += 1
    
    return result

其中

mode
是值
'shortest'
'longest'
。如果您愿意,可以简化为布尔值。为了清楚起见,我使用了字符串。


0
投票

您可以基于函数参数,例如order参数,定义您想要执行的操作。放置一个 if 来标识操作是否:最短执行最短操作,如果不是,执行最长操作。它会添加一些逻辑,但可以帮助避免函数重复并且可以使用相同的作用域。


0
投票

您可以添加一个标志作为参数,并根据它选择相应的比较,例如:

def find_shortest( words, short ):
    shortest = words[ 0 ]
    i = 1
    while i < len( words ):
        if short:
            if len( shortest ) >= len( words[ i ] ): 
                shortest = words[ i ]
        else:
            if len( shortest ) <= len( words[ i ] ): 
                shortest = words[ i ]
        i += 1

    return shortest
    
word = "A short word are in Mexico"
words = word.split( " " )
print( find_shortest( words, True ))
print( find_shortest( words, False ))

0
投票

可以通过 使用 for 循环迭代来简化该函数。

def find_shortest(words):
    shortest = words[0]
    for word in words:
        if len(shortest) >= len(word):
            shortest = word

    return shortest

此时尝试重用这些琐碎的代码会导致代码变得更复杂、更慢;有时剪切和粘贴就可以了。


0
投票

只要使用正常的方式,你几乎没有任何代码需要重复:

def find_shortest(words):
    return min(words, key=len)

def find_longest(words):
    return max(words, key=len)

我真的不会为此编写额外的函数,只需直接使用 min/max 即可。

(这些找到第一个最短/最长,而不是像你的那样最后一个。虽然你谈论“最”短,所以显然你没有联系。但如果你这样做并且很重要,你可以使用

min(reversed(words), key=len) 
)。

© www.soinside.com 2019 - 2024. All rights reserved.