我有一个名为[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
现在我要填两套:
['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
正确的写作方式是什么?
答案 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}