我找到了这个代码示例,我认为它编写得非常好,但是我很难理解为什么它的部分工作原理。
代码搜索字符串中最长的单词:
def LongestWord(str):
''.join(map(lambda x: [' ',x][x.isalnum()], str)).split()
我不知道[' ',x][x.isalnum()]
是如何运作的。这种结构有名字吗?
答案 0 :(得分:5)
将其分为两部分......
[' ', x]
构建一个包含2个元素的列表。重写为:
lst = [' ', x]
lst[x.isalnum()]
现在我们看到第二个括号是索引由第一个括号创建的列表。由于str.isalnum()
返回布尔值(True
或False
),因为布尔值在python中表现得像整数(True
- > 1
,False
- > 0
),然后构造只选择列表中的两个元素之一。
请注意,这些天(python2.5及更高版本),使用条件表达式更具惯用性(并且可能更有效):
lambda x: x if x.isalnum() else ' '
答案 1 :(得分:2)
理解这段代码的关键是要知道布尔值可以用来索引列表。
['a','b'][True] # produces 'b'
['a','b'][False] # produces 'a'
所以代码
[' ',x][x.isalnum()]
如果x是字母数字,将产生x,否则它将产生''
答案 2 :(得分:1)
这是一种将句子字符串分成具有单个单词的列表的方法,但是将所有非字母数字字符替换为通过作为分隔符而被删除的空格。要理解它,您必须从map命令开始。字符串(str)由lambda函数检查,无论它是否为字母数字,如果是,则字符保持不变('x'),但如果不是,则由''(空格)替换。括号的作用类似[false,true] [condition]。 map函数遍历字符串(str)。然后,结果列表(带有单个字符)将作为字符串(使用“”.join命令)连接到完整的句子并分成单词(使用split()命令,并使用空格字符作为分隔符)。