如何对字符串的奇数和偶数单词应用不同的操作?

时间:2018-01-06 18:05:42

标签: python string python-3.x

我正在尝试更新我的字符串:

  • 奇数位置上的每个单词都变为大写。
  • 偶数位置的每个字都被颠倒了

例如,如果我的输入字符串是:

n = 'what is the boarding time in bangalore station'

我希望输出字符串为:

WHAT si THE gnidraob TIME ni BANGALORE noitats

这是我尝试过的代码:

n = 'what is the boarding time in bangalore station'
m = n.split(" ")
k=m[0::2]
for i in k:
    print(i.upper())

7 个答案:

答案 0 :(得分:5)

您的解决方案不完整。而不是切换每个备用词并一次执行一种操作,依次迭代每个词,并在适当的时候处理它。

这是解决问题的一种简单方法。定义一个小功能来为您完成此操作。

  1. 将字符串拆分为单词
  2. 对于每个单词,检查它是否是偶数单词。如果是,则将其大写。如果没有,请将其反转
  3. 将已转换的单词加入单个字符串
  4. def f(n):
        for i, w in enumerate(n.split()):
            if i % 2 == 0:
                yield w.upper()    # uppercase even words
            else:
                yield w[::-1]      # reverse odd words
    

    >>> ' '.join(f('what is the boarding time in bangalore station'))
    'WHAT si THE gnidraob TIME ni BANGALORE noitats'
    

    f做的是将字符串拆分为单词列表。 enumerate将列表转换为(索引,单词)元组列表。使用索引确定该单词是奇数还是偶数单词。 yield将函数转换为生成器,从循环中一次生成一个单词。最后,str.join将每个单词连接回一个字符串。

    请注意,还有其他方法可以实现此目的。我把它们作为练习留给你。

答案 1 :(得分:4)

您可以将zip列表理解表达式(以及str.join一起使用)来获取所需的字符串。例如:

>>> my_str = "what is the boarding time in bangalore station"
>>> words = my_str.split()  # list of words

>>> ' '.join(['%s %s'%(x.upper(), y[::-1]) for x, y in zip(words[::2], words[1::2])])
'WHAT si THE gnidraob TIME ni BANGALORE noitats'

注意:这里我使用的是 list comprehension 而不是 generator 表达式,因为尽管生成器表达式效率更高但情况并非如此与str.join一起使用。为了解这种奇怪行为的原因,请看一下:

这里基于理解的大部分答案都是使用 generator ,尽管他们将其称为 list comprehension :D:D

答案 2 :(得分:1)

另一个列表理解解决方案:

n = 'what is the boarding time in bangalore station'
print(' '.join(word[::-1] if ind % 2 == 1 else word.upper() for ind, word in enumerate(n.split())))

输出:

'WHAT si THE gnidraob TIME ni BANGALORE noitats'

另一种解决方案:

upper_words = [item.upper() for item in n.split()[0::2]]
reverse_words = [item[::-1] for item in n.split()[1::2]]
print(' '.join(word[0] + ' ' + word[1] for word in zip(upper_words, reverse_words)))

输出:

'WHAT si THE gnidraob TIME ni BANGALORE noitats'

答案 3 :(得分:1)

在一行中更具描述性:

print(' '.join([w[::-1] if i % 2 else w.upper() for i, w in enumerate(n.split())]))

输出:

'WHAT si THE gnidraob TIME ni BANGALORE noitats'

答案 4 :(得分:1)

没有达到高水平,只需要if-else:

n = 'what is the boarding time in bangalore station'
m = list(n.split(' '))
for i in range(len(m)):
    if i%2==0:
      print(m[i].upper(),end=' ')
    else:
        print(m[i][::-1].lower(),end=' ')

答案 5 :(得分:0)

使用理解回答问题的另一种方法:

n = 'what is the boarding time in bangalore station'
b = n.split()
final = ' '.join(map(lambda x: ' '.join(x), ((k.upper(), v[::-1]) for k, v in zip(b[::2], b[1::2]))))

print(final)

输出:

'WHAT si THE gnidraob TIME ni BANGALORE noitats'

答案 6 :(得分:0)

怎么样:

n = 'what is the boarding time in bangalore station'

' '.join([token.upper() if i%2==0 else token[::-1] 
          for i, token in enumerate(n.split())
         ]
        )
  1. 使用enumerate()进行迭代以保持计数。
  2. 使用i%2
  3. 检查奇数与偶数
  4. 大写如果是偶数,反向字符串(即str[::-1])如果是奇数
  5. 使用' '.join([...])
  6. 加入子字符串列表