三元运算符python3.5的列表理解

时间:2018-04-20 17:39:59

标签: python python-3.x list-comprehension ternary-operator

我有一个名为[2018-04-20 22:03:47,053] WARN [Consumer clientId=consumer-1, groupId=console-consumer-36123] Connection to node -1 could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient) 的字符串列表。每个字符串都有一个大写字母和' - '并且可能包含小写。

示例:givenProductions可以是givenProductions

现在我要填两套:

  1. 终端(仅包含['S-AA', 'A-a', 'A-b']中的小写)和
  2. nonTerminals(仅包含givenProductions中的大写字母)
  3. 只需一行

    我试过了......

    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
    

    正确的写作方式是什么?

1 个答案:

答案 0 :(得分: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}