小写和大写字母前后

问题描述

我正在尝试在列表中的特定字母之前和之后使用大写字母。前后任意字母大写 大写每个“u”之前和之后的前一个和下一个字母。

对于列表 1,我需要在“u”前后使用大写字母,而不是大写“u”。

lst1 = []
for wrd in capitals:
    wrd = wrd.lower()
    for idx,letter in enumerate(wrd):
        if letter == 'u':
            if idx-1 > 0 and wrd[idx - 1] != 'u':
                wrd = wrd.replace(wrd[idx - 1],wrd[idx - 1].upper())
            if idx+1 < len(wrd) and wrd[idx + 1] != 'u':
                wrd = wrd.replace(wrd[idx + 1],wrd[idx + 1].upper())
    if "u" in wrd:
        lst1.append(wrd)

print(lst1)

原始列表:

['Kabul','Luanda','Buenos Aires','Baku','Nassau','Brussels','Thimphu','Sucre','Ouagadougou','Yaounde','Bangui','Yamoussoukro','Prague','Djibouti','Roseau','Quito','Suva','Banjul','Guatemala City','Bissau','Port au Prince','Tegucigalpa','Budapest','dublin','Jerusalem','Nur-Sultan','Kuwait City','Beirut','Maseru','Vaduz','Vilnius','Luxembourg','Kuala Lumpur','Majuro','Nouakchott','Port Louis','Chisinau','Ulaanbaatar','Maputo','Kathmandu','Managua','Abuja','Muscat','Asuncion','Bucharest','Edinburgh','Ljubljana','mogadishu','SEOul','Juba','Khartoum','damascus','Dushanbe',"Nuku'alofa",'Tunis','Funafuti','Abu Dhabi','Lusaka']    

它打印:

['kaBuL','luAndA','buEnos airEs','baKu','nAssAu','bRuSSelS','tHimpHu','suCre','OuAGAdOuGOu','yaOuNde','banGuI','yamOuSSOuKrO','praGuE','djibOuTi','roseAu','quIto','suVa','banJuL','guAtemAlA city','bissAu','port Au prince','teGuCigalpa','buDapest','dublin','jeRuSalem','nuR-SuLtan','kuWait city','beiRuT','maseRu','vaDuZ','vIlnIuS','luXembOuRg','kuALA LumpuR','maJuRo','nOuAkchott','pOrt lOuIs','chisinAu','uLaanbaatar','maPuTo','kathmanDu','mAnAGuA','aBuJa','muScat','aSuNcioN','buCharest','edinBuRgh','lJuBlJana','mogadisHu','SEOuL','juBa','khartOuM','damaSCuS','duShanbe',"nuKu'alofa",'tuNis','FuNaFuTi','aBu dhaBi','luSaka']

我需要这个:

['kaBuL','LuAnda','BuEnos aires','nassAu','bRuSsels','thimpHu','SuCre','OuAgadOuGOu','yamOuSsOuKro','QuIto','SuVa','GuAtemala city','teGuCigalpa','BuDapest','dublin','NuR-SuLtan','KuWait city','vilnIuS','LuXembOuRg','KuAla LumpuR','nOuAkchott','port lOuIs','manaGuA','MuScat','aSuNcion','BuCharest','lJuBljana','JuBa','damasCuS','DuShanbe',"NuKu'alofa",'TuNis','aBu dhabi','LuSaka']

解决方法

所以根据“新”规则,我更新了我的代码:

search_dict = {
    "u": ['Kabul','Luanda','Buenos Aires','Baku','Nassau','Brussels','Thimphu','Sucre','Ouagadougou','Yaounde','Bangui','Yamoussoukro','Prague','Djibouti','Roseau','Quito','Suva','Banjul','Guatemala City','Bissau','Port au Prince','Tegucigalpa','Budapest','Dublin','Jerusalem','Nur-Sultan','Kuwait City','Beirut','Maseru','Vaduz','Vilnius','Luxembourg','Kuala Lumpur','Majuro','Nouakchott','Port Louis','Chisinau','Ulaanbaatar','Maputo','Kathmandu','Managua','Abuja','Muscat','Asuncion','Bucharest','Edinburgh','Ljubljana','Mogadishu','Seoul','Juba','Khartoum','Damascus','Dushanbe',"Nuku'alofa",'Tunis','Funafuti','Abu Dhabi','Lusaka'],# and so on...
}

result = [["".join(
    [let.upper() if pos in [f for idx,letter in enumerate(word.lower()) if letter == search_let for f in (idx + 1,idx - 1)] and let != search_let else let.lower() for pos,let in enumerate(word.lower())])
    for word in capitals]for search_let,capitals in search_dict.items()]

print(result)

比较结果:

# This list is your expected list from the question
check = ['kaBuL','LuAnda','BuEnos aires','baKu','nassAu','bRuSsels','thimpHu','SuCre','OuAgadOuGOu','yaOuNde','banGuI','yamOuSsOuKro','praGuE','djibOuTi','roseAu','QuIto','SuVa','banJuL','GuAtemala city','bissAu','port Au prince','teGuCigalpa','BuDapest','DuBlin','jeRuSalem','NuR-SuLtan','KuWait city','beiRuT','maseRu','vaDuZ','vilnIuS','LuXembOuRg','KuAla LuMPuR','maJuRo','nOuAkchott','port lOuIs','chisinAu','uLaanbaatar','maPuTo','kathmanDu','manaGuA','aBuJa','MuScat','aSuNcion','BuCharest','edinBuRgh','lJuBljana','mogadisHu','seOuL','JuBa','khartOuM','damasCuS','DuShanbe',"NuKu'alofa",'TuNis','FuNaFuTi','aBu dhabi','LuSaka']

for a,b in zip(check,result[0]):
    print(f"Expected: {a}" + " " * (20 - len(a)) + f"got: {b}" + " " * (20 - len(b)) + f"{a == b}")

print(all([a == b for a,result[0])]))

您可以根据需要向字典中添加任意数量的值。此外,列表理解现在更短了。它不是最有效的,因为它为每个字母生成所需的索引。这可以通过在列表理解之前生成索引来防止。

边缘情况:

  1. “太子港”(或阿布扎比)如果您期待“太子港” (忽略空格),您需要先删除单词(或更改 指数计算)。
  2. “Nuku' Alofa”类似情况,您需要先去除 '

说明

你必须向后阅读这个/列表理解:

这将遍历字典并获取每个字母和大写列表:

for search_let,capitals in search_dict.items()

接下来,我们遍历大写列表并获取每个大写(我们对字典中的每个(键,值)对执行此操作):

for word in capitals

跳过一小部分后(更好地理解),我们在给定大写的搜索字母旁边生成每个字母索引:

[f for idx,idx - 1)]

然后我们检查当前字母的位置是否在我们生成的列表中:

if pos in [list of indices]

并且我们必须检查当前字母是否不是我们的搜索字母:

and let != search_let

如果是这样,我们在输出中添加一个大写字母,否则添加一个小写字母:

[let.upper() if pos in [list of indices] and let != search_let else let.lower()

最后,我们将输出转换回字符串(我们使用了列表推导式,所以之前是列表):

"".join(output list)

其他一切都只是排序和列表理解的东西。

,
def uppercase_before_and_after_letter(s,letter):
    characters = list(s)
    for i,char in enumerate(s):
        if char == letter:
            prev,nxt = i - 1,i + 1
            if prev >= 0:
                characters[prev] = characters[prev].upper()
            if nxt < len(s):
                characters[nxt] = characters[nxt].upper()
    return "".join(characters)

然后像这样使用它:

print([uppercase_before_and_after_letter(word,"z") for word in ['brAzzAville','zAgreb','vadUz']])

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...