16 полезни едноредови Python за опростяване на обичайните задачи

Търсите да пишете елегантен и Pythonic код? Ето списък с полезни едноредови Python за изпълнение на прости задачи.

Ако сте начинаещ програмист на Python, ще отделите време за разбиране на основни структури от данни като списъци и низове. И някои операции върху тези структури от данни могат да бъдат постигнати чрез кратки едноредови кодови фрагменти.

Като програмист трябва да дадете приоритет на четливостта и поддържаемостта пред скъсяването на кода. Но с Python е лесно да се измислят едноредови кодове, които следват добрите практики за кодиране.

В тази статия ще се съсредоточим върху едноредови задачи за прости задачи за обработка на списъци и низове в Python.

Да започваме!

Съдържание

Генерирайте списък с числа

Най-простият начин за генериране на списък с числа е чрез използване на функцията range(). Функцията range() връща обект от диапазон, който можете да прехвърлите в списък. Използването на range(num) ще даде последователността 0, 1, 2,.., num-1.

>>> nums = list(range(10))
>>> nums
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Повече за използването на функцията range().

Можете също да използвате функцията range() заедно с незадължителна стойност на стъпка. Така диапазонът (начало, край, стъпка) ще даде начало на последователността, начало + стъпка, начало + 2*стъпка и т.н. Последната стойност ще бъде начало + k*стъпка, така че (начало + k*стъпка) < край и (начало + (k+1)*стъпка) > край.

Намерете максималните и минималните стойности в списък

Можете да използвате вградените функции max и min, за да изчислите съответно максималните и минималните елементи в списък.

>>> min_elt, max_elt = min(nums), max(nums)
>>> min_elt
0
>>> max_elt
9

📑 Бележка за многократно възлагане

  Топ 11 начина за коригиране на грешка при неуспешно сканиране за вируси в Google Chrome

Забележете, че сме присвоили стойности както на min_elt, така и на max_elt в един оператор за присвояване. Python поддържа такова множествено присвояване. И това може да бъде полезно, когато разопаковате итерами и присвоявате стойности на множество променливи едновременно.

Премахване на дубликати от списък

Друга обичайна операция е премахването на дубликати от списъците на Python. Това е необходимо, когато трябва да работите само с уникалните стойности. Най-лесният начин да направите това е да преобразувате списъка в набор.

Наборът е вградена структура от данни, чиито елементи са уникални и подлежат на хеширане.

>>> nums1 = [2,4,7,9,7,10]

В nums1 елементът 7 се среща два пъти. Прехвърлянето му в набор ще премахне дубликата (тук, 7), оставяйки ни списък с уникални стойности.

Тъй като все още трябва да работим със списъка, ще преобразуваме набора обратно в списък. Тази операция може да бъде изпълнена със следния ред код:

>>> nums1 = list(set(nums1))
>>> nums1
[2, 4, 7, 9, 10]

📒 За да научите повече за други техники за премахване на дубликати от списъци на Python, вижте това ръководство.

Преброяване на срещания в списък

За да преброите колко пъти даден елемент се появява в списък, можете да използвате вградения метод count(). list.count(elt) връща броя пъти, в които elt се появява в списъка.

>>> nums
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Тук 7 се среща веднъж в списъка с числа, така че методът count() връща 1.

>>> nums.count(7)
1

Проверете дали всички елементи в списъка отговарят на дадено условие

За да проверите дали всички елементи в списъка отговарят на условие, можете да използвате вградената функция all() на Python.

Функцията all() приема итерируем като аргумент и връща True, ако всички елементи в итерируемия се оценяват на True (или са верни).

Тук бихме искали да проверим дали всички елементи в списъка nums2 са странни.

>>> nums2 = [3,4,7,11,21,67,12]

Можем да използваме разбиране на списък, за да съставим списък с булеви стойности и можем да предадем този списък като аргумент на функцията all().

Тук num%2!=0 ще бъде False за елементите 4 и 12, които са четни. Следователно списъкът с булеви стойности, конструиран с помощта на израз за разбиране на списък, съдържа False (и all(list) връща False).

>>> all([num%2!=0 for num in nums2])
False

💡 Важно е да се отбележи, че всички ([]) (all(any-empty-iterable) връща True.

Проверете дали някой елемент в списъка отговаря на дадено условие

За да проверите дали някой елемент в списъка отговаря на условие, можете да използвате функцията any(). any(some-list) връща True, ако поне един елемент се изчисли като True.

>>> nums2 = [3,4,7,11,21,67,12]

Както в предишния пример, използваме разбиране на списък, за да получим списък с булеви стойности. Списъкът с числа съдържа четни числа. Така че функцията any() връща True.

>>> any([num%2 for num in nums2])
True

Обръщане на низ

В Python низовете са неизменни, така че когато искате да обърнете низ, можете да получите само обърнато копие на низа. Има два често срещани подхода – и двата могат да бъдат написани като Python с един ред – които използват нарязване на низове и вградени функции.

  14 онлайн курса за управление на проекти за развитие на вашата кариера

Използване на нарязване на низове

Нарязването на низ с отрицателни стойности на стъпка връща част от низа, започвайки от края. Синтаксисът е низ[start:stop:step]. И така, какво връща настройката на стъпка от -1 и игнорирането на индексите за начало и спиране?

Той връща копие на низа, започвайки от края на низа, включително всеки знак.

>>> str1[::-1]
'olleh'

Използване на функцията reversed().

Вградената функция reversed() връща обратен итератор върху последователност.

>>> reversed(str1)
<reversed object at 0x008BAF70>
>>> for char in str1:
...     print(char)
...
h
e
l
l
o

Можете да го използвате заедно с метода join(), както е показано:

>>> ''.join(reversed(str1))
'olleh'

Преобразуване на низ в списък от знаци

Да предположим, че искаме да разделим низ на списък от знаци. Можем да го направим, като използваме израз за разбиране на списък.

>>> str1 = 'hello'

Разбирането на списъци е един от най-мощните едноредови елементи в Python.

📒 Научете повече за разбирането на списъци в Python.

Преминаваме през низа и събираме всеки знак.

>>> chars = [char for char in str1]
>>> chars
['h', 'e', 'l', 'l', 'o']

За да разделите по-дълъг низ в списък от низове при всяко появяване на интервал, можете да използвате метода split().

>>> str2 = 'hello world'
>>> str2.split()
['hello', 'world']

Вече видяхме как да използваме разбиране на списък, за да разделим низ на списък от знаци. В този пример ние събрахме всички знаци чрез преминаване през низа.

Тук трябва да преминем през низа и да съберем само цифрите. И така, как да направим това?

  • Можем да зададем условието за филтриране в израза за разбиране на списъка, като използваме метода isdigit().
  • c.isdigit() връща True, ако c е цифра; в противен случай връща False.
>>> str3 = 'python3'
>>> digits = [c for c in str3 if c.isdigit()]
>>> digits
['3']

Проверете дали даден низ започва с конкретен подниз

За да проверите дали даден низ започва с конкретен подниз, можете да използвате метода за низове startswith(). str1.startswith(substring) връща True, ако str1 започва с подниз. В противен случай връща False.

Ето няколко примера:

>>> str4 = 'coding'
>>> str4.startswith('co')
True
>>> str5 = 'python'
>>> str5.startswith('co')
False

Проверете дали даден низ завършва с конкретен подниз

Както може би се досещате, за да проверите дали даден низ завършва с даден подниз, можете да използвате метода endswith().

>>> str5 = 'python'
>>> str5.endswith('on')
True

Можем също така да използваме метода string в израз за разбиране на списък, за да получим ends_with, списък с булеви стойности.

>>> strs = ['python','neon','nano','silicon']
>>> ends_with = [str.endswith('on') for str in strs]
>>> ends_with
[True, True, False, True]

Обединяване на елементи от списък в низ

Вече видяхме как да разделим низ на списък от знаци. Сега как да направим обратната операция за свързване на елементите на списък в низ?

  14 интересни инструмента за одит и управление на качеството на кода

За да направите това, можете да използвате метода на низа join() със синтаксиса: separator.join(some-list).

Бихме искали само да комбинираме елементите в списъка в един низ; нямаме нужда от разделител. Така че задаваме разделителя на празен низ.

>>> list_1 = ['p','y','t','h','o','n','3']
>>> ''.join(list_1)
'python3'

Създайте речник на Python

Точно по начина, по който разбирането на списъци може да ни помогне да конструираме нови списъци от съществуващи итерируеми елементи, разбиранията на речника могат да ни помогнат да конструираме нови речници от съществуващи итерируеми.

Разбирането на речника на Python е мощен едноредов текст, който може да помогне за изграждането и създаването на речник в движение.

Тук имаме имена, които са списък от низове.

>>> names = ['Joe','Amy','Jake','Florence']

Създаваме names_d, речник, съдържащ низове от имена като ключове и дължините на низовете като стойност.

>>> names_d = {name:len(name) for name in names}
>>> names_d
{'Joe': 3, 'Amy': 3, 'Jake': 4, 'Florence': 8}

Условно присвояване на стойности на променливи

Понякога може да се наложи да присвоите стойности на променливи в зависимост от конкретно условие.

Например, можете да прочетете въведеното от потребителя, да речем, възрастта на индивида. И в зависимост от въведената стойност, можете да решите дали им е позволено да присъстват на парти или не.

За да направите това условно присвояване в Python, можете да напишете следния едноредов, като използвате троичния оператор.

>>> age = 21
>>> allowed = True if age >= 18 else False
>>> allowed
True

🔖 Научете повече за троичния оператор в Python.

Генериране на всички пермутации

Пермутацията се отнася до възможно подреждане на елементи в група. Ако има n уникални елемента в група, има n! възможни начини за подреждането им – и следователно, n! пермутации.

Нека използваме следните букви от списъка:

>>> letters = ['a','b','c']

Можете да използвате пермутации от модула itertools, за да генерирате всички възможни пермутации на дадения iterable.

>>> letters_p = permutations(letters)
>>> letters_p
<itertools.permutations object at 0x0127AF50>

Както се вижда, използването на permutations(iterable) връща обект на пермутация, през който можем да преминем с помощта на for цикъл:

>>> for p in letters_p:
...     print(p)
...
('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')

Но можем да го пренапишем като едноредов израз, като прехвърлим обекта за пермутация в списък:

>>> letters_p = list(permutations(letters))
>>> letters_p
[('a', 'b', 'c'), ('a', 'c', 'b'), ('b', 'a', 'c'), ('b', 'c', 'a'), ('c', 'a', 'b'), ('c', 'b', 'a')]

Тук има три уникални елемента и има 3!=6 възможни пермутации.

Генериране на подмножества от списък

Понякога може да се наложи да конструирате всички възможни подгрупи с определен размер от списък или други итерируеми елементи. Нека използваме списъка с букви и да вземем всички подсписъци с размер 2.

За да направим това, можем да използваме комбинации от модула itertools, като така:

>>> from itertools import combinations
>>> letters_2 = list(combinations(letters,2))
>>> letters_2
[('a', 'b'), ('a', 'c'), ('b', 'c')]

Заключение

В този урок разгледахме полезни едноредови Python за извършване на обичайни операции върху списъци и низове. Научихме също едноредови елементи като списък на Python и разбирания на речници и как да ги използваме заедно с вградени функции за изпълнение на желаните задачи.

Като следваща стъпка вижте този списък с удобни за начинаещи проекти на Python.