两个相邻的Python列表

3

我发现了这个代码示例,我认为它写得非常好,但我有些难以理解其中的一部分。

该代码搜索字符串中最长的单词:

def LongestWord(str):
    ''.join(map(lambda x: [' ',x][x.isalnum()], str)).split()

我不知道 [' ',x][x.isalnum()] 是如何工作的。这种写法有一个专业名称吗?

这是实现三元lambda表达式的另一种方式:lambda x: x if x.isalnum() else ' ' - jonrsharpe
代码搜索字符串中最长的单词。 - Karoly Horvath
@KarolyHorvath 鉴于结果没有被分配,它实际上并没有做任何事情。 - jonrsharpe
@jonrsharpe:我不确定Python编译器是否实际上能够将其优化为无操作。它可能仍然会消耗CPU周期(但我太懒了,不想测试)。因此使用这种措辞。 - Karoly Horvath
我不认为那段代码样本写得很好。它是一个丑陋的结构。 - Dunes
3个回答

5

将其分为2部分...

[' ', 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
或者完全避免使用lambda:''.join(x if x.isalnum() else ' ' for x in str).split()。或者更好的方法是re.split("[^A-Za-z]+", str)-- 函数的实际意图。 - Dunes
@Dunes -- 是的。绝对最好避免使用lambda + map。我没有考虑优化整个表达式 - 只是关于我正在解释的那一部分进行优化。 - mgilson

2
理解这段代码的关键在于知道布尔值可以用来索引列表。
['a','b'][True] # produces 'b'
['a','b'][False] # produces 'a'

所以这段代码
[' ',x][x.isalnum()]

如果x是字母数字,则会产生x,否则将产生''。

1
这是一种将句子字符串拆分为单词列表的方法,但将所有非字母数字字符替换为空格,并通过作为分隔符而被删除。要理解它,您必须从map命令内部开始。lambda函数检查字符串(str)是否为字母数字,如果是,则字符保持不变('x'),但如果不是,则用空格替换。括号的作用类似于[false,true][condition]。map函数遍历字符串(str)。然后,生成的列表(带有单个字符)与完整句子连接成字符串(使用"".join命令),并拆分为单词(使用split()命令,以空格字符作为分隔符)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接