在 Python 中不带括号的字符串切片
Slicing a string in Python without brackets
假设我有一个像 num = "12345"
这样的字符串;如何在不使用括号 (print(num[0])
) 的情况下将其打印为一个字符,如 1
或 2
?
括号可能是执行此操作的正确方法,为什么不希望您使用它?
无论如何,你可以unpack your string(只适用于Python 3作为@DeepSpace精确),像这样:
letter, *_ = num
print(letter)
# "1"
它也适用于任何地方的多个变量:
letter_1, *_, letter_2 = num
print(letter_1, letter_2)
# "1", "5"
还有operator.getitem(a, b)
,它的行为类似于括号,但作为一个函数:
from operator import getitem
letter = getitem(num, 0)
print(letter)
# "1"
最后,正如@EliKorvigo 指出的那样,operator.itemgetter(item)
创建了一个函数,就像括号一样:
from operator import itemgetter
getter = itemgetter(3)
letter = getter(num)
print(letter)
# "4"
又一次滥用 Python 功能。
您可以遍历字符串并仅打印位于特定位置的值。
num = '12345'
values = (0, 1)
for i, n in enumerate(num):
if i in values:
print(n)
使用迭代器:
chars = iter("12345")
print(next(chars)) # 1
print(next(chars)) # 2
您可以使用 itertools.islice()
:
>>> from itertools import islice
>>> num = '123456'
>>> ''.join(islice(num, 0, 1)) # same as num[0]
'1'
>>> n = 4
>>> ''.join(islice(num, n, n+1)) # same as num[4]
'5'
>>> n = 100
>>> ''.join(islice(num, n, n+1)) # _not_ the same as num[100]
''
>>> num[100]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
其他方法包括循环输入字符串所需的次数:
num = '123456'
n = 5
for i, c in enumerate(num):
if i == n:
print(c)
break
# 6
或从字符串的列表副本中弹出项目:
num = '123456'
l = list(num)
n = 5
for i in range(n):
try:
_ = l.pop(0)
except IndexError:
break
print(l.pop(0))
# 6
或者遍历字符串的迭代器版本:
num = '123456'
it = iter(num)
n = 5
for i in range(n):
_ = next(it)
print(next(it))
另一种方法是使用 collections.deque
:
from collections import deque
num = '123456'
d = deque(num)
n = 5
d.rotate(-n)
print d.popleft()
尽管您可能希望对其进行长度检查,以防旋转超出字符串的长度。
假设我有一个像 num = "12345"
这样的字符串;如何在不使用括号 (print(num[0])
) 的情况下将其打印为一个字符,如 1
或 2
?
括号可能是执行此操作的正确方法,为什么不希望您使用它?
无论如何,你可以unpack your string(只适用于Python 3作为@DeepSpace精确),像这样:
letter, *_ = num
print(letter)
# "1"
它也适用于任何地方的多个变量:
letter_1, *_, letter_2 = num
print(letter_1, letter_2)
# "1", "5"
还有operator.getitem(a, b)
,它的行为类似于括号,但作为一个函数:
from operator import getitem
letter = getitem(num, 0)
print(letter)
# "1"
最后,正如@EliKorvigo 指出的那样,operator.itemgetter(item)
创建了一个函数,就像括号一样:
from operator import itemgetter
getter = itemgetter(3)
letter = getter(num)
print(letter)
# "4"
又一次滥用 Python 功能。
您可以遍历字符串并仅打印位于特定位置的值。
num = '12345'
values = (0, 1)
for i, n in enumerate(num):
if i in values:
print(n)
使用迭代器:
chars = iter("12345")
print(next(chars)) # 1
print(next(chars)) # 2
您可以使用 itertools.islice()
:
>>> from itertools import islice
>>> num = '123456'
>>> ''.join(islice(num, 0, 1)) # same as num[0]
'1'
>>> n = 4
>>> ''.join(islice(num, n, n+1)) # same as num[4]
'5'
>>> n = 100
>>> ''.join(islice(num, n, n+1)) # _not_ the same as num[100]
''
>>> num[100]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
其他方法包括循环输入字符串所需的次数:
num = '123456'
n = 5
for i, c in enumerate(num):
if i == n:
print(c)
break
# 6
或从字符串的列表副本中弹出项目:
num = '123456'
l = list(num)
n = 5
for i in range(n):
try:
_ = l.pop(0)
except IndexError:
break
print(l.pop(0))
# 6
或者遍历字符串的迭代器版本:
num = '123456'
it = iter(num)
n = 5
for i in range(n):
_ = next(it)
print(next(it))
另一种方法是使用 collections.deque
:
from collections import deque
num = '123456'
d = deque(num)
n = 5
d.rotate(-n)
print d.popleft()
尽管您可能希望对其进行长度检查,以防旋转超出字符串的长度。