Python 创建一个列表,其中包含第三个列表中指定索引的另一个列表中的项目

Python 创建一个列表,其中包含第三个列表中指定索引的另一个列表中的项目,python,Python,考虑两个列表: a = [2, 4, 5] b = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 我想要一个结果列表c,其中 是长度lenb的列表,其值取自b,b由a中指定的索引定义,其他地方为零 最优雅的方法是什么?将a与and一起使用 这个LC将迭代索引和列表b的值,如果在a中找到索引i,那么它将把元素设置为v,否则它将把它设置为0 a = [2, 4, 5] b = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] c = [v if i in a else

考虑两个列表:

a = [2, 4, 5]
b = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
我想要一个结果列表c,其中

是长度lenb的列表,其值取自b,b由a中指定的索引定义,其他地方为零

最优雅的方法是什么?

将a与and一起使用

这个LC将迭代索引和列表b的值,如果在a中找到索引i,那么它将把元素设置为v,否则它将把它设置为0

a = [2, 4, 5]
b = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

c = [v if i in a else 0 for i, v in enumerate(b)]

print(c)
# [0, 0, 2, 0, 4, 5, 0, 0, 0, 0]
注意:如果a较大,则最好先转换为集合,然后再在中使用。与列表一起使用的选项为On,而对于集合,两者的平均值均为O1

列表理解大致相当于以下代码进行解释:

c = []
for i, v in enumerate(b):
    if i in a:
        c.append(v)
    else:
        c.append(0)
由于您可以选择使用numpy,我在下面介绍了一个简单的方法,它使用初始化一个填充了零的数组,然后使用列表索引替换元素

import numpy as np

a2 = np.array(a)
b2 = np.array(b)

c = np.zeros(len(b2))
c[a2] = b[a2]
当对三种方法my list comp、my numpy和Jon方法计时时,给出了N=1000、a=listrange0、N、10和b=listrangeN的以下结果

这是意料之中的。numpy函数是最快的,但是Jon函数和numpy都比列表理解快得多。如果我将元素的数量增加到100000,那么numpy和Jon方法之间的差距会更大

有趣的是,对于小N,Jon函数是最好的!我怀疑这与创建numpy数组的开销被列表的开销所压倒有关

故事的寓意:大N?跟努比一起去。小N?和乔恩一起去。

和和一起使用a

这个LC将迭代索引和列表b的值,如果在a中找到索引i,那么它将把元素设置为v,否则它将把它设置为0

a = [2, 4, 5]
b = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

c = [v if i in a else 0 for i, v in enumerate(b)]

print(c)
# [0, 0, 2, 0, 4, 5, 0, 0, 0, 0]
注意:如果a较大,则最好先转换为集合,然后再在中使用。与列表一起使用的选项为On,而对于集合,两者的平均值均为O1

列表理解大致相当于以下代码进行解释:

c = []
for i, v in enumerate(b):
    if i in a:
        c.append(v)
    else:
        c.append(0)
由于您可以选择使用numpy,我在下面介绍了一个简单的方法,它使用初始化一个填充了零的数组,然后使用列表索引替换元素

import numpy as np

a2 = np.array(a)
b2 = np.array(b)

c = np.zeros(len(b2))
c[a2] = b[a2]
当对三种方法my list comp、my numpy和Jon方法计时时,给出了N=1000、a=listrange0、N、10和b=listrangeN的以下结果

这是意料之中的。numpy函数是最快的,但是Jon函数和numpy都比列表理解快得多。如果我将元素的数量增加到100000,那么numpy和Jon方法之间的差距会更大

有趣的是,对于小N,Jon函数是最好的!我怀疑这与创建numpy数组的开销被列表的开销所压倒有关


故事的寓意:大N?跟努比一起去。小N?使用Jon。

另一个选项是使用0s预先初始化目标列表-一种快速操作,然后将值过度写入适当的索引,例如:

a = [2, 4, 5]
b = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

c = [0] * len(b)
for el in a:
    c[el] = b[el]

# [0, 0, 2, 0, 4, 5, 0, 0, 0, 0]

另一个选项是使用0s预初始化目标列表-一种快速操作,然后将值重写到合适的索引中,例如:

a = [2, 4, 5]
b = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

c = [0] * len(b)
for el in a:
    c[el] = b[el]

# [0, 0, 2, 0, 4, 5, 0, 0, 0, 0]

你错过了其他的解释:c.0。顺便说一句,这是一个很棒的解决方案。看起来不错,尽管在enumerateb中运行i并不是很贵吗?假设a和b很长。事实上,我确实可以选择numpy。不一定是numpy,但它不会像列表理解一样优雅。您在解释中遗漏了其他内容:c.append0。顺便说一句,这是一个很棒的解决方案。看起来不错,尽管在enumerateb中运行i并不是很贵吗?假设a和b非常长。事实上,我确实可以选择numpy。不一定是numpy,但它不会像列表理解那样优雅。我可能错了,但是python列表不是像数组一样构建的。如果它们不是数组,那么替换列表中的一个元素将非常昂贵。@Rusty Access/settings元素是O1 Python列表的are数组不必是同构类型的-像名称这样的非链表可能是错误的,但Python列表不是像数组一样构建的。如果它们不是数组,那么替换列表中的元素将非常昂贵。@Rusty accessing/settings元素是O1 Python列表中的are数组不必是同构类型的,而不是名称可能暗示的链表