三元运算符python3.5的列表推导

Posted

技术标签:

【中文标题】三元运算符python3.5的列表推导【英文标题】:List comprehension for ternary operator python3.5 【发布时间】:2018-10-01 11:48:15 【问题描述】:

我有一个名为givenProductions 的字符串列表。每个字符串都有一个大写字母和“-”,并且可能包含一个小写字母。

示例:givenProductions 可以是['S-AA', 'A-a', 'A-b']

现在我想填充两组:

    终端(仅包含来自givenProductions的小写字母)和 非终端(仅包含来自givenProductions 的大写字母)

只有一行

我试过这个...

terminals.append(ch) if (ch >= 'a' and ch <= 'z') else nonTerminals.append(ch) if (ch != '-') else print() for ch in prod for prod in givenProductions

导致语法错误

File "<stdin>", line 2
    terminals.append(ch) if (ch >= 'a' and ch <= 'z') else nonTerminals.append(ch) if (ch != '-')   else print ('-') for ch in prod  for prod in givenProductions
                                                                                                                       ^
SyntaxError: invalid syntax

正确的写法是什么?

【问题讨论】:

产品、终端和符号...我闻到了上下文无关语言/语法... 是的,我正在为 lr(0) 解析器编写一个程序……这只是该代码的一部分 与CFGs有关,只是想缩短代码长度。 发布你想要的输出 次要旁注:这是 Python 支持链式比较的经典案例;测试'a' &lt;= ch &lt;= 'z' 将等效于ch &gt;= 'a' and ch &lt;= 'z',但更直接地可读为测试ch 是否出现在给定范围内(并且效率更高,因为它只加载一次ch)。 【参考方案1】:

如果您不关心结果,那么列出推导式绝对没有用。把它写成一个普通的for循环:

for prod in givenProductions:
    for ch in prod:
        if ch >= 'a' and ch <= 'z':
            terminals.append(ch)
        elif ch != '-':
            nonTerminals.append(ch)

请注意,两个for 循环的顺序发生了变化!如果您真的想要使用列表推导式,您也必须这样做。不需要打印,只需用None 完成三元(print() 无论如何都会产生)。此外,列表理解需要方括号 ([]):

>>> givenProductions = ['S-AA', 'A-a', 'A-b']
>>> terminals, nonTerminals = [], []
>>> [terminals.append(ch) if (ch >= 'a' and ch <= 'z') else nonTerminals.append(ch) if (ch != '-') else None for prod in givenProductions for ch in prod]
>>> terminals, nonTerminals
>>> print(terminals, nonTerminals)
['a', 'b'] ['S', 'A', 'A', 'A', 'A']

请注意,这会创建并丢弃None 元素的列表。使用集合解析 () 的内存效率更高,但 CPU 效率更低。

>>> waste = terminals.append(ch) if (ch >= 'a' and ch <= 'z') else nonTerminals.append(ch) if (ch != '-') else None for prod in givenProductions for ch in prod
>>> print(waste)
None

【讨论】:

一般来说,使用任何类型的推导来获得副作用都是不被接受的;它们是一个函数式编程结构,并且函数式编程结构应该是无副作用的(Python 不会强制执行这一点,但是任何时候你将它们用于副作用,你都会冒着混淆维护者的风险,并且,在这种情况下,毫无意义地创建潜在的大而无意义的临时变量,或者无缘无故地做set理解的额外工作)。 @ShadowRanger 同意,我认为在这里使用理解没有任何意义。这是可能的,但不建议这样做。

以上是关于三元运算符python3.5的列表推导的主要内容,如果未能解决你的问题,请参考以下文章

三元表达式列表推导式生成器表达式递归匿名函数内置函数

Python推导式

Java链接列表搜索方法中的三元运算符

是否可以在列表理解上使用三元运算? [复制]

Python:集合函数三元运算符

如何在ajax调用中在jquery中使用三元运算符?