我有一个简短的设备 ID 列表:
dev_id=['208', '209']
而且我还有每个设备的照片列表
files=['pic1.png', 'pic2.png', 'pic3.png', 'pic4.png', 'pic5.png', 'pic6.png']
如何为文件列表中的每 n 张图片添加一个设备 ID?例如,如果我想添加到文件列表的 3 个元素中,以便我有
n_files=['208_pic1.png', '208_pic2.png', '208_pic3.png', '209_pic4.png', '209_pic5.png', '209_pic6.png']
我是 Python 新手,仍然不知道如何正确使用列表
我想我需要做类似的事情
k=0
for i = 1:length(dev_id)
for j=1:3
n_files=dev_id(i)+n_files(i+?)
k+1
end
end
答案 0 :(得分:2)
您可以使用这样的列表理解来实现。然而!!请注意,计算 dev_id
索引的数学需要确保我们不会增加该索引并最终导致数组索引越界错误。
# List comprehension enumerating files, and using integer division to specify dev_id index
# However, note that the math to calc index of dev_id needs to ensure that we don't run into
# array index out of bound
new_list = [dev_id[i//3] + "_" + filename for i, filename in enumerate(files)]
# Using a regular loop to achieve the same
new_list = list()
index = 0
for i in range(len(files)):
if i % 3 == 0 and i != 0:
index += 1
new_list.append(dev_id[index] + "_" +files[i])
输出
['208_pic1.png', '208_pic2.png', '208_pic3.png', '209_pic4.png', '209_pic5.png', '209_pic6.png']
答案 1 :(得分:0)
如果您不想使用列表推导式,请使用嵌套的 for 循环
new_list = []
for ids in dev_id:
for file in files:
new_list.append(ids+'_'+file)
答案 2 :(得分:0)
要将设备 ID 均匀分布在文件上,您需要确定同一设备上的文件块的大小(在这种情况下,6Files/2id = 每个 ID 3 个文件)。
dev_id = ['208', '209']
files = ['pic1.png', 'pic2.png', 'pic3.png', 'pic4.png',
'pic5.png', 'pic6.png']
chunk = (len(files)-1)//len(dev_id)+1
n_files = [f"{d}_{f}" for i,d in enumerate(dev_id)
for f in files[chunk*i:][:chunk]]
['208_pic1.png', '208_pic2.png', '208_pic3.png', '209_pic4.png',
'209_pic5.png', '209_pic6.png']
如果您不关心哪个文件接收哪个 ID 并且为了获得更均匀的传播,您可以使用带有设备 ID 循环的 zip:
from itertools import cycle
n_files = [f"{d}_{f}" for d,f in zip(cycle(dev_id),files)]
['208_pic1.png', '209_pic2.png', '208_pic3.png', '209_pic4.png',
'208_pic5.png', '209_pic6.png']
第二种方法将避免在文件与设备的比率不刷新的情况下让一台设备具有非常少的文件:
例如:
dev_id = ['208', '209', '210']
files = ['pic1.png', 'pic2.png', 'pic3.png', 'pic4.png',
'pic5.png', 'pic6.png','pic7.png']
n_files = [f"{d}_{f}" for d,f in zip(cycle(dev_id),files)]
# 3x208, 2x209, 2x210
['208_pic1.png', '209_pic2.png', '210_pic3.png', '208_pic4.png',
'209_pic5.png', '210_pic6.png', '208_pic7.png']
chunk = (len(files)-1)//len(dev_id)+1
n_files = [f"{d}_{f}" for i,d in enumerate(dev_id)
for f in files[chunk*i:][:chunk]]
# 3x208, 3x209, 1x210
['208_pic1.png', '208_pic2.png', '208_pic3.png', '209_pic4.png',
'209_pic5.png', '209_pic6.png', '210_pic7.png']