我正在尝试编写一个将字符串转换为大写版本的函数。它主要起作用,除非它接近字母表的末尾或输入字符串的结尾。
思考?建议?建议?
def upper(string):
length = len(string)
index_string = 0
index_ucase = 0
index_lcase = 0
uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
lowercase = 'abcdefghijklmnopqrstuvwxyz'
while index_string < len(string):
index_lcase = 0
while index_lcase < len(lowercase):
if string[index_string] == lowercase[index_lcase]:
string = string[:index_string] + uppercase[index_lcase] + string[index_string+1:]
break
else:
index_lcase += 1
index_string += 1
答案 0 :(得分:3)
思考?建议?建议?
不要这样做。
真。
别。
除非你在玩。别。不要这样做。
为什么?
语言很难。
大写到i
是I
,对吗?
你总是可以去大写字母 - &gt;小写字母 - &gt;大写字母,输出与输入相同。正确?
不。不。不,不。
首先,您的方法不包括除ASCII字母之外的任何内容。你知道吗?德语有ä
。 ä
是直截了当的。大写ä
为Ä
,小写Ä
为ä
(如果您想知道:它听起来像英语中的a sad )。
此外,德语有ß
。 ß
是一个小写字母。这听起来很尖锐s
。瑞士,虽然部分说德语,但没有ß
;他们只使用ss
。因此,在德语中,ß
仅出现在单词的中间或末尾。这意味着不需要大写版本;并且,由于德国效率,它根本没有大写版本。
您想在商店入口处写下 CANDY STORE 吗?在正常的大写字母中,它是Süßwarengeschäft(Sweet-Ware-Store)。如果您将其音译为ALL CAPS,那么SÜSSWARENGESCHÄFT是正确的,也是标准的。请注意用大写ß
替换小写SS
。 BAM。无路可退。你的单词只有一个字母,除非你知道德语拼写(并确定店主不是瑞士人),否则无法知道如果你想把东西翻译成小写,你需要使用ß
代替ss
。
也就是说,除非你使用能够提供更多信息的东西。
Unicode可以为您提供更多信息。希腊欧米茄Ω
可能只是 - 一个长“O”的声音,或者它可能是电阻的单位,欧姆:Ω
。不同的含义(虽然可能看起来相同),对于Unicode而言,通常足以使用不同的代码点。如果您在Unicode中使用大型Omega Ω
并在其上使用pythons lower()
,它应该正确地为您提供⍵
。如果您使用u"The resistance of this resistor is 5Ω"
并使用lower
,请注意:u"the resistance of this resistor is 5Ω"
。
因此:不要使用简单的每字母翻译。它永远不会奏效,它永远不会。
答案 1 :(得分:1)
我建议用词:
letters = {'a': 'A'... 'z': 'Z'}
然后:
def upper(s):
r = ''
for i in s:
if i in letters:
r = r + letters[i]
else:
r = r + i
return r
我认为这些可以解决你的问题。您的代码究竟在哪里失败?
答案 2 :(得分:0)
嗯......我会用一种更简单的方法
import string
def upper(instring='abacbba'):
char_map = {l:u for l,u in zip(string.ascii_lowercase, string.ascii_uppercase)}
return "".join([map[char] if char in char_map.keys() else char for char in instring])
这对于ascii只适用于btw ...
答案 3 :(得分:0)
或者另一种方式。
test = "This is a sentence."
print "".join([char if char not in lowercase else uppercase[lowercase.index(char)] for char in test])
# THIS IS A SENTENCE.
只是澄清一下,它等同于此;
result = ""
for char in test:
if char not in lowercase:
result += char
else:
result += uppercase[lowercase.index(char)]
print result
答案 4 :(得分:0)
uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ '
lowercase = 'abcdefghijklmnopqrstuvwxyz '
首先,您可以使用zip和字典理解来映射两个字母列表。
mapping = {i: j for i, j in zip(lowercase, uppercase)}
接下来,您可以使用列表推导来映射它们。
def upper(s):
S = ''.join([mapping.get(i, i) for i in s])
return S
遵循Paul Rooney的建议(使用mapping.get())意味着代码对于意外字符是健壮的。只有字典中的字符会改变。
答案 5 :(得分:0)
x = 'hello world'
print "".join( [ chr(ord(c) - 32) if 97<=ord(c)<=122 else c for c in x ])
那应该有用。它使用的事实是ascii小写在[97,122]范围内,相应的大写字母在65-90范围内编码。
答案 6 :(得分:0)
from string import ascii_lowercase as lowercase
from string import ascii_uppercase as uppercase
def upper(string):
return ''.join([uppercase[lowercase.find(char)] for char in string])
当您可以导入常量时,您不必自己定义常量。我的上层函数中唯一的行是:
for char in string
lowercase.find(char)
uppercase[lowercase.find(char)]
''.join([uppercase[lowercase.find(char)] for char in string])
答案 7 :(得分:0)
不确定你为什么要这样做。这是一个ASCII实现
// segvforce -- force a segfault on going over bounds
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <sys/mman.h>
#ifndef PAGESIZE
#define PAGESIZE 4096
#endif
// number of guard pages that follow
// NOTE: for simple increments, one is usually sufficient, but for larger
// increments or more complex indexing, choose a larger value
#ifndef GUARDCNT
#define GUARDCNT 1
#endif
#define GUARDSIZE (PAGESIZE * GUARDCNT)
// crash_alloc -- allocate for overbound protection
void *
crash_alloc(size_t curlen)
{
size_t pagelen;
void *base;
void *endp;
pagelen = curlen;
// align up to page size
pagelen += PAGESIZE - 1;
pagelen /= PAGESIZE;
pagelen *= PAGESIZE;
// add space for guard pages
pagelen += GUARDSIZE * 2;
base = NULL;
posix_memalign(&base,PAGESIZE,pagelen);
printf("base: %p\n",base);
// point to end of area
endp = base + pagelen;
printf("endp: %p\n",endp);
// back up to guard page and protect it
endp -= GUARDSIZE;
printf("prot: %p\n",endp);
mprotect(endp,GUARDSIZE,PROT_NONE);
// point to area for caller
endp -= curlen;
printf("fini: %p\n",endp);
return endp;
}
// main -- main program
int
main(int argc,char **argv)
{
int n;
int *arr;
int idx;
int val;
n = 3;
arr = crash_alloc(sizeof(int) * n);
val = 0;
for (idx = 0; idx <= n; ++idx) {
printf("try: %d\n",idx);
val += arr[idx];
}
printf("finish\n");
return val;
}
答案 8 :(得分:0)
你知道python中有一个名为upper()
的函数可以做同样的事情,对吗?
s= "little boy doesn't cry"
print s.upper()
你为什么要从头开始写作?