For 循环 - 在列表中创建最多三个项目的列表
For loop - Create list in list for max three items
问题:
我想制作一个子列表字符串数为 3 的列表列表。我用矩阵技术尝试过它,但到目前为止它还行不通。
无法计数,创建列表,第一个元素,第二个元素,第三个元素,创建新列表,插入第四个元素,第五个元素,第六个元素,创建新列表...
如果代码也适用于不能除以 3 的项目列表长度,那就太好了。就像我的源列表中的 8 个字符串一样。
示例数据:
my_list = ['Item11', 'Item12', 'Item13', 'Item24', 'Item25', 'Item26', 'Item37', 'Item38', 'Item39']
我试过的:
sublist = []
for mainlist in range(3):
# Append an empty sublist inside the list
mainlist.append([])
for item in my_list:
for sublist in mainlist:
sublist.append(item)
print(sublist)
预期结果:
my_list = [['Item11', 'Item12', 'Item13'], ['Item24', 'Item25', 'Item26'], ['Item37', 'Item38', 'Item39']]
它叫做 "yield chunks",在得知这个词是什么后我找到了一个帖子。
List to Whosebug solutions to chunck a list
def chunks(lst, n):
"""Yield successive n-sized chunks from lst."""
for i in range(0, len(lst), n):
yield lst[i:i + n]
print(list(chunks(my_list, 3)))
使用 itertools 的第二个解决方案:
#from itertools import izip_longest as zip_longest # for Python 2.x
from itertools import zip_longest # for Python 3.x
#from six.moves import zip_longest # for both (uses the six compat library)
def grouper(n, iterable, padvalue=None):
"grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')"
return zip_longest(*[iter(iterable)]*n, fillvalue=padvalue)
print(grouper(3, my_list)))
我认为这就是您要查找的内容(如果 my_list
中的项目数不能被 3 整除,则同样有效):
my_list = ['Item11', 'Item12', 'Item13', 'Item24', 'Item25', 'Item26', 'Item37', 'Item38', 'Item39']
mainlist = []
if len(my_list) < 3:
mainlist.append(my_list)
else:
# The magic is here
first_items = my_list[::3]
second_items = my_list[1::3]
third_items = my_list[2::3]
for i in range(len(third_items)):
temp_list = [first_items[i], second_items[i], third_items[i]]
mainlist.append(temp_list)
# This if is for when the number of items are not divisible by 3
if len(second_items) > len(third_items):
if len(first_items) > len(second_items):
mainlist.append([first_items[-1]])
else:
mainlist.append([first_items[-1], second_items[-1]])
print(mainlist)
问题:
我想制作一个子列表字符串数为 3 的列表列表。我用矩阵技术尝试过它,但到目前为止它还行不通。
无法计数,创建列表,第一个元素,第二个元素,第三个元素,创建新列表,插入第四个元素,第五个元素,第六个元素,创建新列表...
如果代码也适用于不能除以 3 的项目列表长度,那就太好了。就像我的源列表中的 8 个字符串一样。
示例数据:
my_list = ['Item11', 'Item12', 'Item13', 'Item24', 'Item25', 'Item26', 'Item37', 'Item38', 'Item39']
我试过的:
sublist = []
for mainlist in range(3):
# Append an empty sublist inside the list
mainlist.append([])
for item in my_list:
for sublist in mainlist:
sublist.append(item)
print(sublist)
预期结果:
my_list = [['Item11', 'Item12', 'Item13'], ['Item24', 'Item25', 'Item26'], ['Item37', 'Item38', 'Item39']]
它叫做 "yield chunks",在得知这个词是什么后我找到了一个帖子。
List to Whosebug solutions to chunck a list
def chunks(lst, n):
"""Yield successive n-sized chunks from lst."""
for i in range(0, len(lst), n):
yield lst[i:i + n]
print(list(chunks(my_list, 3)))
使用 itertools 的第二个解决方案:
#from itertools import izip_longest as zip_longest # for Python 2.x
from itertools import zip_longest # for Python 3.x
#from six.moves import zip_longest # for both (uses the six compat library)
def grouper(n, iterable, padvalue=None):
"grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')"
return zip_longest(*[iter(iterable)]*n, fillvalue=padvalue)
print(grouper(3, my_list)))
我认为这就是您要查找的内容(如果 my_list
中的项目数不能被 3 整除,则同样有效):
my_list = ['Item11', 'Item12', 'Item13', 'Item24', 'Item25', 'Item26', 'Item37', 'Item38', 'Item39']
mainlist = []
if len(my_list) < 3:
mainlist.append(my_list)
else:
# The magic is here
first_items = my_list[::3]
second_items = my_list[1::3]
third_items = my_list[2::3]
for i in range(len(third_items)):
temp_list = [first_items[i], second_items[i], third_items[i]]
mainlist.append(temp_list)
# This if is for when the number of items are not divisible by 3
if len(second_items) > len(third_items):
if len(first_items) > len(second_items):
mainlist.append([first_items[-1]])
else:
mainlist.append([first_items[-1], second_items[-1]])
print(mainlist)