列表理解一次将奇数加两次

时间:2019-03-29 14:54:52

标签: python arrays list list-comprehension

我正在学习列表理解的过程,偶然发现一种无法找到足够理解的资源的问题。

问题源于以下问题: 我们有一个数组[1,2,3,8,9],想要创建一个表达式,该表达式将返回每个奇数两次,而偶数仅返回一次。

注意:还有一个提示,我可以创建嵌套列表,但是到目前为止,这仍然没有帮助我确定如何为我服务。

相应算法的输出应为:[1,1,2,3,3,8,9,9]

使用循环,我可以这样做:

OtherNumList = [1, 2, 3, 8, 9]
OtherNumList2 = []
for i in OtherNumList:
    if i%2==1:
        OtherNumList2.append(i)
        OtherNumList2.append(i)
    else:
        OtherNumList2.append(i)
print(OtherNumList2)

我只想使用一个表达式来执行此操作,否则要使用列表理解来将其“单行”。

我正在努力理解如何将理解力设置为如果X追加两次,而如果Y追加一次。

很感谢您的帮助,即使只是理解理解的概念;我不希望有一个汤匙式的解决方案,如果您可以引导我完成自己的思考过程,以便将来为更好的清单理解打下更好的基础,我会更喜欢它! :)

5 个答案:

答案 0 :(得分:10)

您可以在没有外部工具的情况下通过单个列表理解来执行此操作。您只需要根据从外部序列中拉出的值来制作和遍历内部值序列即可:

OtherNumList = [1, 2, 3, 8, 9]
OtherNumList2 = [rep for i in OtherNumList for rep in (i,)*(i%2+1)]
print(OtherNumList2)

这里的技巧是第二个for。根据{{​​1}}是偶数(一个副本)还是奇数(两个副本),迭代tuple的一两个副本中的i。方便地,我们甚至不需要在这里进行真正的布尔检查。 i对于偶数来说始终是(i%2+1),对于奇数来说1总是这样,因此我们可以使用它直接相乘。然后直接产生正确次数的结果值,而无需额外的展平。

答案 1 :(得分:3)

一种方法是生成一个嵌套列表,然后使用例如itertools.chain将其展平。棘手的部分是立即创建一个平面列表,因为当不满足条件时,您必须一次附加多个元素,因此您需要做一些额外的工作来平整结果列表:

from itertools import chain
list(chain.from_iterable([i] if i%2 == 0 else [i]*2 for i in l))

输出

[1, 1, 2, 3, 3, 8, 9, 9]

尽管在我看来,执行此操作的最佳方法是使用生成器函数,或者非常相似的是您共享的函数,但对于大型列表可能更可取:

def my_fun(l):
    for i in l:
        if i%2 == 0:
            yield i
        else:
            yield i
            yield i

list(my_fun(l))
# [1, 1, 2, 3, 3, 8, 9, 9]

答案 2 :(得分:1)

import numpy as np
num_list = [1, 2, 3, 8, 9]
new_list = []

for x in num_list:
    new_list.extend(np.repeat(x, 2, axis=0)) if x%2 == 1 else new_list.append(x)

答案 3 :(得分:1)

一个想法是首先给出一个列表列表,就像给您的提示一样。

nested_list = [[i] if i % 2 == 0 else [i] * 2 for i in NumList] 

这将为您提供以下内容:

[[1, 1,], [2], [3, 3], [8], [9, 9]]

现在,您只需要在同一行中展平此数组。为此,我在这里引用的是最高答案:How to make a flat list out of list of lists?

答案 4 :(得分:1)

我相信这就是作者在提示中使用嵌套列表的意思。

x = [1, 2, 3, 8, 9]
[[value]*(value%2+1) for value in x]