9 лайфхаков со списками и словарями Python для следующего собеседования по программированию
Списки и словари являются одними из наиболее часто используемых структур данных для программирования на Python.
В этом посте я делюсь 9 лайфхаками для списков и словарей Python. Поскольку списки и словари являются одними из наиболее часто используемых структур данных в Python, понимание и способность использовать эти фрагменты кода для различных вариантов использования позволит вам стать лучшим программистом на следующем собеседовании.
1. Сглаживание списка
Когда вам дан многоуровневый список или массив, который не является одномерным, вы можете захотеть сгладить его до простого списка.
lst = [[2,3], [4,5], [6,7]]
# Use List Comprehension
flatten\_lst = [i for j in lst for i in j ]
flatten\_lst
>> [2,3,4,5,6,7]
2. Самый частый элемент в списке
Функция Counter
из пакета Collections
удобна для отслеживания количества различных элементов в списке. Пакет Collections является пакетом по умолчанию и поэтому не требует дополнительной установки, если у вас уже установлен Python.
import Counter from collections
l = [1,1,3,4,1,5,6,7,7,2,9]
freq_element = Counter(1).most_common()[0][0]
freq_element
>> 1
3. Распечатайте все комбинации списка
Напоминаем, что комбинация — это математический метод, который определяет количество возможных расположений в наборе элементов, где порядок выбора не имеет значения.
Пакет Itertools
, как следует из названия, содержит множество функций, включающих итерации. Комбинации также требуют итераций и поэтому включены в этот пакет в двух разных формах (т.е. combinations
, combinations_with_replacement
) в зависимости от того, что именно вы ищете. Itertools также является пакетом по умолчанию в Python.
from itertools import combinations, combinations_with_replacement
nums = [1,2,3,4]
list(combinations(nums,2))
>> [[(1,2,), (1,3), (1,4), (2,3), (2,4), (3,4)]
list(combinations_with_replacement(nums,2))
>> [[(1,1),(1,2),(1,3),(1,4),(2,2),(2,3),(2,4),(3,3),(3,4),(4,4)]
list(combinations(nums,3))
>> [(1,2,3),(1,2,4),(1,3,4),(2,3,4)]
4. Инвертировать словарь
from collections import defaultdict
def invert_dict(obj):
inv_obj = defaultdict(list)
for key, value in obj.items():
inv_obj[value].append(key)
return dict(inv_obj)
## Example
food= {
'cookie': 10,
'cake': 10,
'ramen': 3,
}
invert_dict(food)
>> { 10: ['cookie', 'cake'], 3: ['ramen'] }
5. Комбинируйте словарные значения
Defaultdict — это подкласс класса словаря, который возвращает объект, подобный словарю. Чем это отличается от обычного словаря? Хотя словарь и словарь по умолчанию почти идентичны, последний позволяет нам избежать KeyErrors. Другими словами, он предоставляет значение по умолчанию для несуществующего ключа. Эта характеристика defaultdictionary упрощает следующие операции.
from collections import defaultdict
def comb_dict_val(*dicts):
res = defaultdict(list)
for d in dicts:
for key in d:
res[key].append(d[key])
return dict(res)
# Example
d1 = {'a': 1, 'b': 'hi', 'c': 10}
d2 = {'a': 2, 'b': 'josh', 'd': 20}
comb_dict_val(d1,d2)
>> {'a': [1, 3], 'b': ['hi', 'josh'], 'c': [10], 'd': [20]}
6. Сортировать список, используя другой список в качестве индексов
def sort_by_index(lst, indexes, reverse=False):
new_list = \
[val for (_, val) in sorted(zip(indexes, lst), \
key=lambda x: x[0], reverse=reverse)]
return new_list
a = ['jake', 'amy', 'christine', 'fernando', 'david', 'hosea']
b = [3, 2, 6, 4, 1, 5]
sort_by_index(a, b)
>> ['david', 'amy', 'jake', 'fernando', 'hosea', 'christine']
7. Группируйте различные элементы в списке на основе некоторого условия и превращайте его в словарь.
from collections import defaultdict
def group_by(lst, fn):
d = defaultdict(list)
for el in lst:
d[fn(el)].append(el)
return dict(d)
from math import floor
# Example
group_by([6.1, 4.2, 6.3], floor)
>> {4: [4.2], 6: [6.1, 6.3]}
group_by(['one', 'two', 'three'], len)
>> {3: ['one', 'two'], 5: ['three']}
8. Реализуйте перетасовку списков без использования готовых функций
Используем алгоритм Фишера-Йейтса. Он создает беспристрастные случайные перестановки списков, что часто имеет решающее значение для выборки. Популяризированный Кнутом, он беспристрастен, имеет оптимальную линейную эффективность по времени; использует постоянное пространство; и является инкрементным.
from random import randint
def shuffle(lst):
temp_lst = deepcopy(lst)
m = len(temp_lst)
while (m):
m -= 1
i = randint(0, m)
temp_lst[m], temp_lst[i] = temp_lst[i], temp_lst[m]
return temp_lst
# Example
foo
>> [1, 2, 3]
shuffle(foo)
foo
>> [2, 3, 1]
9. Проверьте, удовлетворяет ли каждый элемент списка какому-либо условию
def every(lst, fn = lambda x: x):
return all(map(fn, lst))
# Example
every([4, 2, 3], lambda x: x > 1)
>> True