这是我的清单
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中实现这一点?
答案 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
会返回一个迭代器。)