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

时间:2015-07-13 19:40:38

标签: python jython

我编写的代码用于分隔“偶数”和“奇数”索引处的字符,我想修改它,以便用大写/小写分隔字符。我无法弄清楚如何为"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

3 个答案:

答案 0 :(得分:1)

您是否希望获得两个字符串,一个包含所有大写字母,另一个包含所有小写字母?下面是一个函数,它将返回两个字符串,上面的小写字母:

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。必要时使用它们。

答案 1 :(得分:1)

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

顺便说一句,对于奇数/偶数索引你可以这样做:

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

答案 2 :(得分:0)

有一个名为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使用谓词函数来确定迭代中的每个项是否都是小写的。如果不是,则将其过滤为假组。否则,它将被过滤为真实项目组。我们迭代公开这些组。

偶数和奇数指数

你可以修改它以适用于奇数和偶数索引:

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()对象来枚举iterable。然后我们迭代子项,以便子项仅产生字母。

有关更多工具,另请参阅more_itertools docs