在python

时间:2015-07-26 13:26:46

标签: 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)]

现在我想为每个块添加一个'数据',使它看起来像

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

但元组是不可变的,我必须销毁它们,追加并再次创建它们。

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

5 个答案:

答案 0 :(得分:5)

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')]

答案 1 :(得分:3)

您可以使用itertools.repeat创建一个包含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')]
>>> 

请注意,正如@ his answer中提到的@Padraic Cunningham,无需在len中调用itertools.repeat函数。因此,您只需使用repeat('data')

如果要在创建后修改元组列表,可以使用列表推导通过向元组添加新元素来修改元组。

示例:

>>> 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)]
>>> 

答案 2 :(得分:1)

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

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')]

答案 3 :(得分:1)

由于元组是不可变的,如果你经常添加和删除它们,你可能最好使用列表列表:

list1 = [1,2,3,4,5,6,7,8,9,10,11,12]
it = iter(list1)
chunked_lists = [list(a) for a in zip(it,it,it)]  
# => [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]

for l in chunked_lists:
    l.append('data')
# => [[1, 2, 3, 'data'], [4, 5, 6, 'data'], [7, 8, 9, 'data'], [10, 11, 12, 'data']]

答案 4 :(得分:0)

在创建zip本身时,如何将它们添加到chunked_lists函数中

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

对于Python 3.x,您需要使用len(list1)运算符来划分//(使其返回int)。 (并且很可能在zip中包装list(),因为Python 3.x中的zip会返回一个迭代器。)