没有 if 但有 else 的列表理解
list comprehension without if but with else
我的问题旨在在列表理解中使用 for 循环的 else 条件。
示例:
empty_list = []
def example_func(text):
for a in text.split():
for b in a.split(","):
empty_list.append(b)
else:
empty_list.append(" ")
我想通过对两个 for 循环使用列表理解来使其更清晰。
但是我如何通过为其中一个循环(在本例中为第二个循环)包含一个转义子句来做到这一点。
我知道我可以在列表理解中使用 if with 和 without else。但是在没有 if 语句的情况下使用 else 怎么样?
有没有办法让解释器将其理解为 for 循环的转义子句?
非常感谢任何帮助!
编辑:
感谢您的回答!事实上,我正在尝试翻译摩尔斯电码。
输入是一个字符串,包含摩尔斯电码。
每个单词由 3 space 分隔。每个单词的每个字母之间用1space.
隔开
def decoder(code):
str_list = []
for i in code.split(" "):
for e in i.split():
str_list.append(morse_code_dic[e])
else:
str_list.append(" ")
return "".join(str_list[:-1]).capitalize()
print(decoder(".. - .-- .- ... .- --. --- --- -.. -.. .- -.--"))
我想把整个句子分解成单词,然后翻译每个单词。
内循环(一个词的翻译)完成后,它会启动它的escape-clause else,添加一个space,这样整个句子的结构就会被保留下来。这样,3 个空格将被转换为一个 space。
如评论中所述,else
并没有多大意义,因为在 for
循环之后 else
的目的实际上是保存条件代码如果循环正常终止(即不是通过 break
),则执行,而您的循环 总是 ,因此它总是被执行。
所以这并不是对如何在列表理解中执行 that 的问题的真正答案,而是更多的替代方案。您可以只使用两个嵌套的 join
生成器表达式,一个用于句子,一个用于单词,而不是在所有单词后添加 spaces,然后删除最后一个 space 并将所有内容连接在一起:
def decoder(code):
return " ".join("".join(morse_code_dic[e] for e in i.split())
for i in code.split(" ")).capitalize()
如评论中所述,您的特定示例中的 else
子句毫无意义,因为它始终运行。让我们设计一个示例,让我们研究模拟 break
和 else
.
的可能性
取下面的字符串:
s = 'a,b,c b,c,d c,d,e, d,e,f'
假设您想像以前一样用空格和逗号拆分字符串,但您只想保留内部拆分的元素,直到第一次出现 c
:
out = []
for i in s.split():
for e in i.split(','):
if e == 'c':
break
out.append(e)
else:
out.append('-')
可以使用 iter
的神秘 two-arg 形式来模拟 break
,它接受一个可调用对象和一个终止值:
>>> x = list('abcd')
>>> list(iter(iter(x).__next__, 'c'))
['a', 'b']
您可以通过 chaining 内部可迭代实现 else
['-']
。
>>> from itertools import chain
>>> x = list('abcd')
>>> list(iter(chain(x, ['-'])
.__next__, 'c'))
['a', 'b']
>>> y = list('def')
>>> list(iter(chain(y, ['-'])
.__next__, 'c'))
['d', 'e', 'f', '-']
注意 chain
的位置在这里很重要。如果您要将破折号链接到外部迭代器,它将始终被追加,而不仅仅是在没有遇到 c
时:
>>> list(chain(iter(iter(x).__next__, 'c'), ['-']))
['a', 'b', '-']
您现在可以用一个表达式模拟整个嵌套循环:
from itertools import chain
out = [e for i in s.split() for e in iter(chain(i.split(','), ['-']).__next__, 'c')]
我的问题旨在在列表理解中使用 for 循环的 else 条件。
示例:
empty_list = []
def example_func(text):
for a in text.split():
for b in a.split(","):
empty_list.append(b)
else:
empty_list.append(" ")
我想通过对两个 for 循环使用列表理解来使其更清晰。
但是我如何通过为其中一个循环(在本例中为第二个循环)包含一个转义子句来做到这一点。 我知道我可以在列表理解中使用 if with 和 without else。但是在没有 if 语句的情况下使用 else 怎么样?
有没有办法让解释器将其理解为 for 循环的转义子句?
非常感谢任何帮助!
编辑: 感谢您的回答!事实上,我正在尝试翻译摩尔斯电码。
输入是一个字符串,包含摩尔斯电码。 每个单词由 3 space 分隔。每个单词的每个字母之间用1space.
隔开def decoder(code):
str_list = []
for i in code.split(" "):
for e in i.split():
str_list.append(morse_code_dic[e])
else:
str_list.append(" ")
return "".join(str_list[:-1]).capitalize()
print(decoder(".. - .-- .- ... .- --. --- --- -.. -.. .- -.--"))
我想把整个句子分解成单词,然后翻译每个单词。 内循环(一个词的翻译)完成后,它会启动它的escape-clause else,添加一个space,这样整个句子的结构就会被保留下来。这样,3 个空格将被转换为一个 space。
如评论中所述,else
并没有多大意义,因为在 for
循环之后 else
的目的实际上是保存条件代码如果循环正常终止(即不是通过 break
),则执行,而您的循环 总是 ,因此它总是被执行。
所以这并不是对如何在列表理解中执行 that 的问题的真正答案,而是更多的替代方案。您可以只使用两个嵌套的 join
生成器表达式,一个用于句子,一个用于单词,而不是在所有单词后添加 spaces,然后删除最后一个 space 并将所有内容连接在一起:
def decoder(code):
return " ".join("".join(morse_code_dic[e] for e in i.split())
for i in code.split(" ")).capitalize()
如评论中所述,您的特定示例中的 else
子句毫无意义,因为它始终运行。让我们设计一个示例,让我们研究模拟 break
和 else
.
取下面的字符串:
s = 'a,b,c b,c,d c,d,e, d,e,f'
假设您想像以前一样用空格和逗号拆分字符串,但您只想保留内部拆分的元素,直到第一次出现 c
:
out = []
for i in s.split():
for e in i.split(','):
if e == 'c':
break
out.append(e)
else:
out.append('-')
可以使用 iter
的神秘 two-arg 形式来模拟 break
,它接受一个可调用对象和一个终止值:
>>> x = list('abcd')
>>> list(iter(iter(x).__next__, 'c'))
['a', 'b']
您可以通过 chaining 内部可迭代实现 else
['-']
。
>>> from itertools import chain
>>> x = list('abcd')
>>> list(iter(chain(x, ['-'])
.__next__, 'c'))
['a', 'b']
>>> y = list('def')
>>> list(iter(chain(y, ['-'])
.__next__, 'c'))
['d', 'e', 'f', '-']
注意 chain
的位置在这里很重要。如果您要将破折号链接到外部迭代器,它将始终被追加,而不仅仅是在没有遇到 c
时:
>>> list(chain(iter(iter(x).__next__, 'c'), ['-']))
['a', 'b', '-']
您现在可以用一个表达式模拟整个嵌套循环:
from itertools import chain
out = [e for i in s.split() for e in iter(chain(i.split(','), ['-']).__next__, 'c')]