Если вы не можете использовать zip
, тогда вы можете просто использовать индекс элементов.
record = ['L', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'L', 'W', 'W']
points = [4, 1, 3, 2, 7, 4, 3, 10, 8, 14, 7, 6, 7]
combined = [{'points': points[i], 'result': record[i]} for i in range(len(record))]
# this way is cleaner
#combined = [{'points': p, 'result': r} for r, p in zip(record, points)]
Теперь combined
- это список словарей, содержащих пары ключ / значение для record
и точек entries
в ваших исходных списках.Предполагается, что оба списка имеют одинаковую длину, но это разумное предположение, в противном случае ваши данные не являются действительными.zip
без проблем справится с этим, остановившись, когда он исчерпает самый короткий из двух списков.Этот код выдавал бы, если бы он пытался получить доступ к несуществующему индексу в любом списке.
Если вы хотите теперь запросить этот список, вы можете просто использовать встроенную функцию filter
и передать ей предикат длярешить, что в результатах, а что нет.
пример
print('matches where score was greater than 3')
for result in filter(lambda r: r['points'] > 3, combined):
print(result)
Это включает в себя любые записи со значением баллов больше 3. Вы также можете легко сделать это <
(меньше чем), >=
(больше или равно) или ==
(равно) любому числу, которое вы хотите.
Вы также можете объединить параметр результата в то, что отфильтровано по
print('matches where score was less than 5 but won')
for result in filter(lambda r: r['points'] < 5 and r['result'] == 'W', combined):
print(result)
Примечание: функция фильтра всегда линейна (O (n)).Они всегда бегают по всем записям.Так что для больших наборов результатов это неэффективно и медленно.Один из способов настройки заключается в сортировке списка по счету и использовании бинарных поисков (в python - модуль bisect
), чтобы сузить область поиска.Это будет иметь влияние только в том случае, если вы осуществляете поиск по оценкам.Если вы хотите выполнить поиск по W / L результату, вы вернетесь к линейному.