从Scratch将字符串转换为Upper

时间:2016-01-19 23:43:31

标签: python string python-2.7

我正在尝试编写一个将字符串转换为大写版本的函数。它主要起作用,除非它接近字母表的末尾或输入字符串的结尾。

思考?建议?建议?

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

9 个答案:

答案 0 :(得分:3)

  

思考?建议?建议?

不要这样做。

真。

别。

除非你在玩。别。不要这样做。

为什么?

语言很难。

大写到iI,对吗?

你总是可以去大写字母 - &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])

当您可以导入常量时,您不必自己定义常量。我的上层函数中唯一的行是:

  1. 遍历输入字符串:for char in string
  2. 查找字符串lowercase.find(char)
  3. 中每个字符的位置
  4. 将其映射到大写等效uppercase[lowercase.find(char)]
  5. 将每个结果的大写字符列表连接到一个字符串''.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()

你为什么要从头开始写作?