Вам просто не хватает шага для итерации по списку, чтобы вы могли повторить dict(zip(...))
для каждого куска элементов, соответствующего количеству столбцов (при условии, что вам действительно нужен список диктов - немного отличающийся от ваш пример вывода). Что-то вроде:
cols = ['Id', 'TopSite', 'Floor', 'Room']
items = ['1','ABC','ABC001','ABC002','2','ABC','ABC001','ABC003','3','DEF','DEF001','DEF001']
results = [dict(zip(cols, items[i:i + len(cols)])) for i in range(0, len(items), len(cols))]
print(results)
# OUTPUT
# [{'Id': '1', 'TopSite': 'ABC', 'Floor': 'ABC001', 'Room': 'ABC002'}, {'Id': '2', 'TopSite': 'ABC', 'Floor': 'ABC001', 'Room': 'ABC003'}, {'Id': '3', 'TopSite': 'DEF', 'Floor': 'DEF001', 'Room': 'DEF001'}]
Конечно, вам действительно не нужен промежуточный шаг, если ваша цель - преобразовать в фрейм данных. Вы можете получить его, передав список столбцов в качестве параметра вместе с сокращенной версией списка элементов. Например:
import pandas as pd
cols = ['Id', 'TopSite', 'Floor', 'Room']
items = ['1','ABC','ABC001','ABC002','2','ABC','ABC001','ABC003','3','DEF','DEF001','DEF001']
chunks = [items[i:i + len(cols)] for i in range(0, len(items), len(cols))]
df = pd.DataFrame(chunks, columns=cols)
print(df)
# OUTPUT
# Id TopSite Floor Room
# 0 1 ABC ABC001 ABC002
# 1 2 ABC ABC001 ABC003
# 2 3 DEF DEF001 DEF001
Кроме того, оба примера будут работать быстрее для больших списков, если вы обрабатываете биты len(...)
с переменными, а не запускаете их снова и снова в пределах понимания.