如何分隔字符串中的大小写字母

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')

这给了你两个变量,upperlower。必要时使用它们。

>>> filter(str.isupper, "AbBZxYp")
'ABZY'
>>> filter(str.islower, "AbBZxYp")
'bxp'

顺便说一句,对于 odd/even 索引,您可以这样做:

>>> "AbBZxYp"[::2]
'ABxp'
>>> "AbBZxYp"[1::2]
'bZY'

有一个名为 partition 的 itertools 方法可以做到这一点。这是实现:

来自itertools recipes

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 了解更多工具。