Python列表理解镜像值

时间:2018-02-28 17:05:21

标签: python list-comprehension

我试图通过列表理解找出以下问题,但我无法使其工作。我将向您展示如何使用循环和列表理解来解决问题。

所以,我有一个列表,在一个范围内可以有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.显然,我不希望它像那样。

我应该坚持使用工作解决方案,还是通过列表推导解决问题?我一直试图练习列表理解,但它还没有完全在我的大脑中。非常感谢。

3 个答案:

答案 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]