了解在字典中找到最长键的函数

时间:2018-11-08 02:57:01

标签: python dictionary

下面的find_longest类中的dict方法在字典中找到最长的键值。

class LongestKey(dict):
    def find_longest(self):
        longest = None
        for key in self:
            if not longest or len(key) > len(longest):
                longest = key
        print(key)

a = LongestKey()
a["hi"] = 1
a["hello"] = 2
a["hey there"] = 3
a["greetings sir"] = 4

a.find_longest()

代码正在运行,但是我很难理解if not或语句背后的逻辑。我原来用

if len(key) > len(longest):

代替

if not longest or len(key) > len(longest):

,但会产生错误:TypeError: object of type 'NoneType' has no len()。为什么是这样?非常感谢您的启发。

5 个答案:

答案 0 :(得分:0)

这是因为您正在检查设置为longest的{​​{1}}的长度。因此是错误。

示例

None

之所以没有得到该错误,是因为执行了x = None print(len(x)) # output TypeError: object of type 'NoneType' has no len() ,而第二个条件if not longest却没有执行,因为第一个条件已经匹配。最重要的是,它起作用的原因是len(key) > len(longest)的值在第二次迭代中发生了变化。

答案 1 :(得分:0)

首先,您声明变量<ContentPage.Content> <ScrollView> <StackLayout> <BoxView BackgroundColor="Red" HeightRequest="600" WidthRequest="150" /> <Entry /> </StackLayout> </ScrollView> </ContentPage.Content> 并将其分配给longest

None

def find_longest(self): longest = None 没有NoneType。因此它导致了这一说法:

len()

它检查if not longest or len(key) > len(longest): ... 是否已更新

答案 2 :(得分:0)

为什么需要进行if not longest检查是因为第一次运行循环时,longestNone,而您不能执行len(None)。因此,您进行if not longest检查,并且只有在False时,才检查第二个条件。


在这种情况下,可以通过将longest而不是-1初始化为None并将len(key)longest(不是len(longest))进行比较来避免这种额外的检查。 。

类似这样的东西:

class LongestKey(dict):    
    def find_longest(self):
        longest = -1  
        for key in self:
            if len(key) > longest:
                longest = len(key)
                longest_key = key
        print(longest_key)   # <-- print longest key not just key.

注意:您的代码仅打印最后一个键,而每次可能都不是最长的键。在if中,您需要更新最长密钥以及longest的值,如图所示。

答案 3 :(得分:0)

这是为了防止在for循环的第一次迭代过程中发生错误。

首先评估逻辑表达式的not longest部分,如果它是True,则不评估表达式的其余部分or len(key) > len(longest)部分,并且该值整个表达式也将是True

之所以需要这样做,是因为最初longest设置为None,并且编写了逻辑表达式以防止下半部分的len(longest)部分被求值,而{{1} }是因为TypeError尚未长。

答案 4 :(得分:0)

做事时:

longest=None

您要确保对象最长具有'无值'或'空值'。在Python中,我们不需要先声明变量,因此Python中没有真正的 empty 变量。将变量设置为 None 不同于将其设置为默认的空值。一个值也不是什么,尽管它经常被用来表示。 那么,如果对象为空,如何计算其长度呢?这就是这里使用的逻辑, longest 根本没有任何值,因此会引发错误:

TypeError: object of type 'NoneType' has no len()

使用时:

if not longest or len(key) > len(longest):

您要确保对象最长的值没有 None