我正在学习列表理解的过程,偶然发现一种无法找到足够理解的资源的问题。
问题源于以下问题: 我们有一个数组[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追加一次。
很感谢您的帮助,即使只是理解理解的概念;我不希望有一个汤匙式的解决方案,如果您可以引导我完成自己的思考过程,以便将来为更好的清单理解打下更好的基础,我会更喜欢它! :)
答案 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]