Python 如何在嵌套列表中复制元素?

Python 如何在嵌套列表中复制元素?,python,itertools,nested-lists,Python,Itertools,Nested Lists,我有一个嵌套列表,如下所示: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 我想将每个内部列表中的每个元素复制3次,并将它们并排放置: [[1, 1, 1, 2, 2, 2, 3, 3, 3], [4, 4, 4, 5, 5, 5, 6, 6, 6], [7, 7, 7, 8, 8, 8, 9, 9, 9]] 这是我当前的解决方案: from itertools import repeat x2 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

我有一个嵌套列表,如下所示:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
我想将每个内部列表中的每个元素复制3次,并将它们并排放置:

[[1, 1, 1, 2, 2, 2, 3, 3, 3], [4, 4, 4, 5, 5, 5, 6, 6, 6], [7, 7, 7, 8, 8, 8, 9, 9, 9]]
这是我当前的解决方案:

from itertools import repeat

x2 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

ls = []
for i in x2:
    ls.append([x for item in i for x in repeat(item, 3)])
ls
>>> [[1, 1, 1, 2, 2, 2, 3, 3, 3],
 [5, 5, 5, 6, 6, 6, 7, 7, 7],
 [9, 9, 9, 10, 10, 10, 11, 11, 11],
 [4, 4, 4, 8, 8, 8, 3, 3, 3]]
ls=[sum([[i]*3 for i in k], []) for k in x2]

>>>print(ls)
[[1, 1, 1, 2, 2, 2, 3, 3, 3], [4, 4, 4, 5, 5, 5, 6, 6, 6], [7, 7, 7, 8, 8, 8, 9, 9, 9]]
有没有办法加快速度?

这里有一个解决方案:

from itertools import repeat

x2 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

ls = []
for i in x2:
    ls.append([x for item in i for x in repeat(item, 3)])
ls
>>> [[1, 1, 1, 2, 2, 2, 3, 3, 3],
 [5, 5, 5, 6, 6, 6, 7, 7, 7],
 [9, 9, 9, 10, 10, 10, 11, 11, 11],
 [4, 4, 4, 8, 8, 8, 3, 3, 3]]
ls=[sum([[i]*3 for i in k], []) for k in x2]

>>>print(ls)
[[1, 1, 1, 2, 2, 2, 3, 3, 3], [4, 4, 4, 5, 5, 5, 6, 6, 6], [7, 7, 7, 8, 8, 8, 9, 9, 9]]
这里有一个解决方案:

from itertools import repeat

x2 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

ls = []
for i in x2:
    ls.append([x for item in i for x in repeat(item, 3)])
ls
>>> [[1, 1, 1, 2, 2, 2, 3, 3, 3],
 [5, 5, 5, 6, 6, 6, 7, 7, 7],
 [9, 9, 9, 10, 10, 10, 11, 11, 11],
 [4, 4, 4, 8, 8, 8, 3, 3, 3]]
ls=[sum([[i]*3 for i in k], []) for k in x2]

>>>print(ls)
[[1, 1, 1, 2, 2, 2, 3, 3, 3], [4, 4, 4, 5, 5, 5, 6, 6, 6], [7, 7, 7, 8, 8, 8, 9, 9, 9]]
正如你所要求的更快,这里是这里和其他地方不同的可能方式之间的一些比较

  • 我使用了您的方法,使用
    repeat
    ,并添加了一个列表comp版本,以便与其他版本匹配
  • 我用过
  • 我使用了来自的
    zip
    版本
  • 我使用了“纯”列表comp解决方案
结果(在我的机器上)是(按升序排列):

使用_-zip 5.630
使用_repeat _comp5.818
使用_sum 5.905
使用_重复6.421
使用_pure 6.878
令人惊讶的是(对我来说),
zip
解决方案实际上是最快的,而
repeat
解决方案的列表comp版本则是第二位。我认为“纯”列表比较快,但实际上是最差的。我想


还有另一个结果(提议者):

使用_sort 3.219
正如您所看到的,情况明显好转,但我将其单独列出,因为它在很大程度上依赖于上面的特定示例。所以,如果你想复制一个升序数字列表,那将是你的最佳选择


生成它们的代码是:

import timeit
从itertools导入重复
x2=[[1,2,3],[4,5,6],[7,8,9]]
使用_repeat()定义:
ls=[]
对于x2中的i:
ls.追加([x代表i中的项目,x代表重复(项目3)])
返回ls
使用_repeat_comp()定义:
返回[[x代表i中的项目,x代表x重复(项目,3)]代表x2中的i]
使用_zip()定义:
返回[[x表示三合一拉链(l,l,l)表示三合一拉链中的x]表示x2中的l]
使用_sum()定义:
返回[求和([[i]*3表示k中的i],]表示x2中的k]
使用_pure()定义:
返回[[范围(3)内的子列表中的val对应val]x2中的子列表的val]
使用_sort()定义:
返回[x2中sub的排序(sub[:]*3]
对于[using_repeat,using_repeat,using_zip,using_sum,using_pure,using_sort]中的func:
打印(func.\uuuuu name\uuuuuuuuuuuu,timeit.timeit(f“{func.\uuuuuu name\uuuuuuuuo}()”,f“from{uuuuuuuu main\uuuuuuuuuuu导入{func.\uuuuuu name\uuuuuo}”))
正如您所要求的更快,这里是这里与其他地方不同可能方式之间的一些比较

  • 我使用了您的方法,使用
    repeat
    ,并添加了一个列表comp版本,以便与其他版本匹配
  • 我用过
  • 我使用了来自的
    zip
    版本
  • 我使用了“纯”列表comp解决方案
结果(在我的机器上)是(按升序排列):

使用_-zip 5.630
使用_repeat _comp5.818
使用_sum 5.905
使用_重复6.421
使用_pure 6.878
令人惊讶的是(对我来说),
zip
解决方案实际上是最快的,而
repeat
解决方案的列表comp版本则是第二位。我认为“纯”列表比较快,但实际上是最差的。我想


还有另一个结果(提议者):

使用_sort 3.219
正如您所看到的,情况明显好转,但我将其单独列出,因为它在很大程度上依赖于上面的特定示例。所以,如果你想复制一个升序数字列表,那将是你的最佳选择


生成它们的代码是:

import timeit
从itertools导入重复
x2=[[1,2,3],[4,5,6],[7,8,9]]
使用_repeat()定义:
ls=[]
对于x2中的i:
ls.追加([x代表i中的项目,x代表重复(项目3)])
返回ls
使用_repeat_comp()定义:
返回[[x代表i中的项目,x代表x重复(项目,3)]代表x2中的i]
使用_zip()定义:
返回[[x表示三合一拉链(l,l,l)表示三合一拉链中的x]表示x2中的l]
使用_sum()定义:
返回[求和([[i]*3表示k中的i],]表示x2中的k]
使用_pure()定义:
返回[[范围(3)内的子列表中的val对应val]x2中的子列表的val]
使用_sort()定义:
返回[x2中sub的排序(sub[:]*3]
对于[using_repeat,using_repeat,using_zip,using_sum,using_pure,using_sort]中的func:
打印(func.\uuuuu name\uuuuuuuuuuuu,timeit.timeit(f“{func.\uuuuuu name\uuuuuuuuo}()”,f“from{uuuuuuuu main\uuuuuuuuuuu导入{func.\uuuuuu name\uuuuuo}”))

如果您使用lambda x函数,有一种方法可以使用np.repeat()完成!第一次使用“f=lambda x:np.重复(x2,3)”。然后使用“np.apply_沿_轴(f,1,x)”,您将得到相同的答案;代码检查是询问堆栈溢出的正确位置。哦,好的,很抱歉,这是我第一次提交问题,谢谢你的输入,我下次会这样做。谢谢,似乎也可以:)这可以用一行代码来完成,列表理解dupes=[[val for val in sublist for I in range(3)]for sublist in x2]。但不确定它是否更快。如果您使用lambda x函数,有一种方法可以使用np.repeat()完成!第一次使用“f=lambda x:np.重复(x2,3)”。然后使用“np.apply_沿_轴(f,1,x)”,您将得到相同的答案;代码检查是询问堆栈溢出的正确位置。哦,好的,很抱歉,这是我第一次提交问题,谢谢你的输入,我下次会这样做。谢谢,似乎也可以:)这可以用一行代码来完成,列表理解dupes=[[val for val in sublist for I in range(3)]for sublist in x2]。不知道是否更快。啊,你比我快:我刚刚完成了相同方法的
timeit
测试,+1!。我很好奇
zip
是最快的。。这也是“最少”可扩展的方法,比如说如果用户突然想要4份而不是3份..@Wololo同意。这也让我感到惊讶。我的自然选择将是你的名单比较,令人惊讶的是,以及实际上是最慢的!我的错,我只是注意到了。我