我编写的代码用于分隔“偶数”和“奇数”索引处的字符,我想修改它,以便用大写/小写分隔字符。我无法弄清楚如何为"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
答案 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')
为您提供了两个变量upper
和lower
。必要时使用它们。
答案 1 :(得分:1)
>>> filter(str.isupper, "AbBZxYp")
'ABZY'
>>> filter(str.islower, "AbBZxYp")
'bxp'
顺便说一句,对于奇数/偶数索引你可以这样做:
>>> "AbBZxYp"[::2]
'ABxp'
>>> "AbBZxYp"[1::2]
'bZY'
答案 2 :(得分:0)
有一个名为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
使用谓词函数来确定迭代中的每个项是否都是小写的。如果不是,则将其过滤为假组。否则,它将被过滤为真实项目组。我们迭代公开这些组。
偶数和奇数指数
你可以修改它以适用于奇数和偶数索引:
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。