我在EdaBit上发现了一个编码挑战。
在一个整数范围内
- 把每一个3的倍数都替换成... ...
WORD
- 将每一个5的倍数替换为
EXAMPLE
- 取而代之的是
WORDEXAMPLE
- 在一个列表中返回所有的数字,中间不是3和5的倍数。
我想用一个 名单理解 来做这件事。我想出了这个办法,但没有用。
return [i for i in range(start, end) if i%3 != 0 and i%5 != 0, "WORD" for i in range(start, end) if i%3==0 and i%5!=0, "EXAMPLE" for i in range(start, end) if i%3!=0 and i%5==0, "WORDEXAMPLE" for i in range(start, end) if if i%3==0 and i%5==0]
我希望它是一个列表理解,而不是像这样。
others = [i for i in range(start, end) if i%3 != 0 and i%5 != 0]
multiples_3 = ["WORD" for i in range(start, end) if i%3 == 0 and i%5 != 0]
multiples_5 = ["EXAMPLE" for i in range(start, end) if i%3 != 0 and i%5 == 0]
multiples_3_and_5 = ["WORDEXAMPLE" for i in range(start, end) if i%3 == 0 and i%5 == 0]
一般来说,你能不能根据不同的条件 创建一个使用多个函数的列表理解?
是的,可以这样做(虽然不可取,因为它很难读懂)。代码将是
numbers = range(1, 100) # Example
returned_list = ["WORDEXAMPLE" if i%(3*5)==0 else "WORD" if i%3==0 else "EXAMPLE" if i%5==0 else i for i in numbers]
在列表理解中,你需要使用多个 else语句(类似于elif语句否则)。
你可以像这样定义一个函数来处理所有的逻辑。
def relace_num(num):
if num % (3*5) == 0:
return 'WORDEXAMPLE'
elif num % 3 == 0:
return 'WORD'
elif num % 5 == 0:
return 'EXAMPLE'
else:
return num
然后使用一个列表理解。
[relace_num(x) for x in range(start, end)]