Вот пример использования чистых встроенных функций:
Дано
data = {
"A":["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"],
"B":[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
"C":[ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32],
"D":[ 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42],
}
pred = lambda x: (x[0] >= "e") and (x[0] < "j")
Код
transposed = list(zip(*data.values()))
revised = list(filter(pred, transposed))
Сейчаспечать:
for row in revised:
print ("My required Data", row)
Вывод
My required Data ('e', 4, 25, 35)
My required Data ('f', 5, 26, 36)
My required Data ('g', 6, 27, 37)
My required Data ('h', 7, 28, 38)
My required Data ('i', 8, 29, 39)
Подробности
Легко транспонировать данные с пониманием,Вот результаты transposed
:
[('a', 0, 21, 31),
('b', 1, 22, 32),
('c', 2, 23, 33),
('d', 3, 24, 34),
('e', 4, 25, 35),
('f', 5, 26, 36),
('g', 6, 27, 37),
('h', 7, 28, 38),
('i', 8, 29, 39),
('j', 9, 30, 40),
('k', 10, 31, 41),
('l', 11, 32, 42)]
Вы на полпути туда.Просто отфильтруйте результаты по условной функции (или pred
icate) и напечатайте.
Re: предикаты
Поскольку строки можно сравнивать в Python, вы можете простоопределить предикат, который говорит: «принимать все строки, где первый элемент - это буква от e
до меньше j
».Для краткости мы используем lambda
для создания условной функции.Мы можем легко переписать его как обычную функцию:
def pred(x):
return (x[0] >= "e") and (x[0] < "j")
Re: эффективность
- Для краткости: код состоит из 2-3 строк по сравнению с9 строк ОП.
- Кодирование: нет никаких жестко закодированных поисков, кроме предиката, который вы предоставляете.Выберите регулярную функцию, если вы планируете использовать этот подход повторно.Кроме того, нет вложенных условных выражений и легко читается.
- По скорости: если вы планируете многократно запрашивать данные, использование промежуточного диктанта должно повысить производительность, сократив поиск с O (n) до O (1) по времени.
Альтернативный пример:
# Using dictionaries
pred = lambda x: x >= "e" and x < "j"
transposed_dict = {x[0]: x[1:] for x in zip(*data.values())}
revised_dict = {k: v for k, v in transposed_dict.items() if pred(k)}
Допущения
Никаких дополнительных модулей не требуется при условии:
- неупорядоченные данные: этот пример дает упорядоченные результаты в Python 3.6+.Если в младших версиях требуется порядок, убедитесь, что данные построены с
collections.OrderedDict
. - одинаковыми по размеру значениями:
zip
работает нормально, если вы знаете, что значения списка в dict имеют одинаковую длину, как видно изОП.В противном случае используйте itertools.zip_longest
.