我试图通过列表理解找出以下问题,但我无法使其工作。我将向您展示如何使用循环和列表理解来解决问题。
所以,我有一个列表,在一个范围内可以有0到6个元素(6),当我在其上应用我的函数时,我想更改值,如下所示:
l = [0, 1, 2, 3, 4, 5]
mirror = [5, 4, 3, 2, 1, 0]
我不想将数组旋转180度但实际上我想要替换这些值。例如,我的列表现在看起来像这样:
l = [2, 5]
然后l_inverted列表应如下所示:
l_inverted = [3, 0]
我提出了解决问题的常规方法,但自从我开始学习Python以来,我更喜欢列表推导。
l = [0, 3, 5]
mirror = [5, 4, 3, 2, 1, 0]
i = 0
for element in l:
l[i] = mirror[element]
i += 1
这实际上反转了l列表。这是我使用列表理解的方法:
l = [3, 5]
mirror = [5, 4, 3, 2, 1, 0]
for element in l:
print(element)
l = [mirror[element] if x==element else x for x in l]
这很好用。 直到:
l = [0, 3, 5]
mirror = [5, 4, 3, 2, 1, 0]
for element in l:
print(element)
l = [mirror[element] if x==element else x for x in l]
因此它会将0替换为0,将2替换为3,并将两个5(也是新的)替换为0.显然,我不希望它像那样。
我应该坚持使用工作解决方案,还是通过列表推导解决问题?我一直试图练习列表理解,但它还没有完全在我的大脑中。非常感谢。
答案 0 :(得分:2)
你淹死在一勺水中,试图把我们带走。 您正在使用错误的命名约定,使您的简单问题难以理解。
orig = [0, 1, 2, 3, 4, 5]
orig_rev = l[::-1]
selector = [0, 3, 5]
result = [orig_rev[i] for i in selector]
print(result ) # [5, 2, 0]
答案 1 :(得分:1)
如果你想把它作为列表理解:
>> l = [0, 3, 5]
>> mirror = [5, 4, 3, 2, 1, 0]
>> l_inverted = [mirror[x] for x in l]
>> l_inverted
[5, 2, 0]
答案 2 :(得分:0)
根据您的前两个示例,您可能正在寻找的是根据某个基数来补充每个数字,类似于ones' complement。您可以将基本硬编码为5或其他任何内容,或者您可以根据列表中的最大数字来确定它。这是后者的解决方案:
<强>概念强>
[每个镜像项目] = [整个列表的最大值] - [项目]
<强>代码强>
L = [0, 1, 2, 3, 4, 5]
Lmax = max(L)
m = [Lmax - item for item in L]
print m
<强>结果强>
[5, 4, 3, 2, 1, 0]