在python中添加和创建列表块

2024-04-23 06:38:19 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的名单

list1 = [1,2,3,4,5,6,7,8,9,10,11,12]

我试过这么做

it = iter(list1)

chunked_lists =  zip(it,it,it)

chunked_lists is now = [(1,2,3),(4,5,6),(7,8,9),(10,11,12)]

现在我想在每个块中添加一个'data',使其看起来像

[(1,2,3,'data'),(4,5,6,'data')....etc]

但是元组是不可变的,我必须销毁它们,附加它们,然后再创建它们。你知道吗

有没有更好的方法在python中实现这一点?你知道吗


Tags: 方法dataisetcitzipnowlists
3条回答
it = iter(list1)
from itertools import repeat
chunked_lists =  zip(it,it,it,repeat("data"))
[(1, 2, 3, 'data'), (4, 5, 6, 'data'), (7, 8, 9, 'data'), (10, 11, 12, 'data')]

这应该是一种线性时间方式:

list1 = [1,2,3,4,5,6,7,8,9,10,11,12]
result = [tuple(list1[x:x+3]+["data"]) for x in range(0, len(list1), 3)]

如果我没有忽略一些复杂的Python,since tuple() has complexity O(n)the slice accessor has complexity O(k)+["data"]引起的开销并不比简单地在列表末尾附加一个节点(即O(1))大,那么它应该是O((len(list1) / k) * k ^ 2)又名O(n k),在您的例子中k固定为3。你知道吗

result = [tuple(list1[x:x+3]+["data"]) for x in range(0, len(list1), 3)]

指:

[list1[x:x+3]+["data"] for x in (0, 3, ... 12)]

又名:

[
 tuple(list1[0:3]+["data"]),
 tuple(list1[4:6]+["data"]),
 ...
 tuple(list1[9:12]+["data"])
]

对于奇数列表,它也表现得很好:

>>> list1 = [1,2,3,4,5,6,7,8,9,10,11]
>>> print [tuple(list1[x:x+3]+["data"]) for x in range(0, len(list1), 3)]
[(1, 2, 3, 'data'), (4, 5, 6, 'data'), (7, 8, 9, 'data'), (10, 11, 'data')]

您可以使用^{}创建一个包含data的新迭代器,然后对以前的迭代器和新的重复迭代器应用zip函数:

>>> it = iter(list1)
>>> it2=repeat('data',len(list1))
>>> chunked_lists =  zip(it,it,it,it2)
>>> chunked_lists
[(1, 2, 3, 'data'), (4, 5, 6, 'data'), (7, 8, 9, 'data'), (10, 11, 12, 'data')]
>>> 

注意,正如@Padraic Cunningham在his answer中提到的那样,不需要调用itertools.repeat中的len函数

如果要在创建元组后修改元组列表,可以使用列表理解通过向元组添加新元素来修改元组。你知道吗

示例:

>>> import numpy as np
>>> l2=np.random.randint(0,100,len(list1)/3)
>>> it = iter(list1)
>>> chunked_lists =  zip(it,it,it)
>>> chunked_lists = [i+(j,) for i,j in zip(chunked_lists,l2)]
>>> l2
array([35, 22, 35, 95])
>>> chunked_lists
[(1, 2, 3, 35), (4, 5, 6, 22), (7, 8, 9, 35), (10, 11, 12, 95)]
>>> 

相关问题 更多 >