如何分隔字符串中的大小写字母
How to separate upper and lower case letters in a string
我编写了在 'even' 和 'odd' 索引处分隔字符的代码,我想对其进行修改,以便按 upper/lower 大小写分隔字符。我不知道如何为 "AbBZxYp"
这样的字符串执行此操作。我曾尝试使用 .lower
和 .upper
,但我认为我使用不正确。
def upperLower(string):
odds=""
evens=""
for index in range(len(string)):
if index % 2 == 0:
evens = evens + string[index]
if not (index % 2 == 0):
odds = odds + string[index]
print "Odds: ", odds
print "Evens: ", evens
您是否希望获得两个字符串,一个全部为大写字母,另一个全部为小写字母?下面是一个函数,它将 return 两个字符串,大写然后小写:
def split_upper_lower(input):
upper = ''.join([x for x in input if x.isupper()])
lower = ''.join([x for x in input if x.islower()])
return upper, lower
然后您可以使用以下方式调用它:
upper, lower = split_upper_lower('AbBZxYp')
这给了你两个变量,upper
和 lower
。必要时使用它们。
>>> filter(str.isupper, "AbBZxYp")
'ABZY'
>>> filter(str.islower, "AbBZxYp")
'bxp'
顺便说一句,对于 odd/even 索引,您可以这样做:
>>> "AbBZxYp"[::2]
'ABxp'
>>> "AbBZxYp"[1::2]
'bZY'
有一个名为 partition
的 itertools 方法可以做到这一点。这是实现:
def partition(pred, iterable):
'Use a predicate to partition entries into false entries and true entries'
# partition(is_odd, range(10)) --> 0 2 4 6 8 and 1 3 5 7 9
t1, t2 = tee(iterable)
return filterfalse(pred, t1), filter(pred, t2)
大小写字母
您可以手动实现后一个配方,或者安装一个库来为您实现它,例如pip install more_itertools
:
import more_itertools as mit
iterable = "AbBZxYp"
pred = lambda x: x.islower()
children = mit.partition(pred, iterable)
[list(c) for c in children]
# [['A', 'B', 'Z', 'Y'], ['b', 'x', 'p']]
此处partition
使用谓词函数来确定可迭代对象中的每一项是否为小写。如果不是,则将其过滤到 false 组中。否则,它被过滤到真正的项目组中。我们迭代以公开这些组。
偶数和奇数索引
您可以修改它以同时适用于奇数和偶数索引:
import itertools as it
import more_itertools as mit
iterable = "AbBZxYp"
pred = lambda x: x[0] % 2 != 0
children = mit.partition(pred, tuple(zip(it.count(), iterable)))
[[i[1] for i in list(c)] for c in children]
# [['A', 'B', 'x', 'p'], ['b', 'Z', 'Y']]
这里我们zip
一个itertools.count()
object来枚举iterable。然后我们迭代 children 以便子项只产生字母。
另请参阅 more_itertools
docs 了解更多工具。
我编写了在 'even' 和 'odd' 索引处分隔字符的代码,我想对其进行修改,以便按 upper/lower 大小写分隔字符。我不知道如何为 "AbBZxYp"
这样的字符串执行此操作。我曾尝试使用 .lower
和 .upper
,但我认为我使用不正确。
def upperLower(string):
odds=""
evens=""
for index in range(len(string)):
if index % 2 == 0:
evens = evens + string[index]
if not (index % 2 == 0):
odds = odds + string[index]
print "Odds: ", odds
print "Evens: ", evens
您是否希望获得两个字符串,一个全部为大写字母,另一个全部为小写字母?下面是一个函数,它将 return 两个字符串,大写然后小写:
def split_upper_lower(input):
upper = ''.join([x for x in input if x.isupper()])
lower = ''.join([x for x in input if x.islower()])
return upper, lower
然后您可以使用以下方式调用它:
upper, lower = split_upper_lower('AbBZxYp')
这给了你两个变量,upper
和 lower
。必要时使用它们。
>>> filter(str.isupper, "AbBZxYp")
'ABZY'
>>> filter(str.islower, "AbBZxYp")
'bxp'
顺便说一句,对于 odd/even 索引,您可以这样做:
>>> "AbBZxYp"[::2]
'ABxp'
>>> "AbBZxYp"[1::2]
'bZY'
有一个名为 partition
的 itertools 方法可以做到这一点。这是实现:
def partition(pred, iterable):
'Use a predicate to partition entries into false entries and true entries'
# partition(is_odd, range(10)) --> 0 2 4 6 8 and 1 3 5 7 9
t1, t2 = tee(iterable)
return filterfalse(pred, t1), filter(pred, t2)
大小写字母
您可以手动实现后一个配方,或者安装一个库来为您实现它,例如pip install more_itertools
:
import more_itertools as mit
iterable = "AbBZxYp"
pred = lambda x: x.islower()
children = mit.partition(pred, iterable)
[list(c) for c in children]
# [['A', 'B', 'Z', 'Y'], ['b', 'x', 'p']]
此处partition
使用谓词函数来确定可迭代对象中的每一项是否为小写。如果不是,则将其过滤到 false 组中。否则,它被过滤到真正的项目组中。我们迭代以公开这些组。
偶数和奇数索引
您可以修改它以同时适用于奇数和偶数索引:
import itertools as it
import more_itertools as mit
iterable = "AbBZxYp"
pred = lambda x: x[0] % 2 != 0
children = mit.partition(pred, tuple(zip(it.count(), iterable)))
[[i[1] for i in list(c)] for c in children]
# [['A', 'B', 'x', 'p'], ['b', 'Z', 'Y']]
这里我们zip
一个itertools.count()
object来枚举iterable。然后我们迭代 children 以便子项只产生字母。
另请参阅 more_itertools
docs 了解更多工具。