標籤:

Python 字母行轉序號應該怎麼做?

26個字母表對應字母表中的序號,如a對應1,

現在

例如我輸入「abbb」,如何得到「1222」,請問有什麼簡單的辦法嗎?

謝謝


如果確認只有小寫字元,且 a-z 分別對應著 1-26,則可以這樣:

.join(str(ord(n) - 96) for n in s)

------------------

不推薦使用 + 連接字元串,在 Python 中,str 的 C 實現 PyStringObject 對象是一個不可變對象,當每次進行字元串連接時,過程中會創建一個新的 PyStringbject。所以,當連接 N 個 PyStringObject 時,會進行 N-1 次內存申請及移動操作,這是非常低效的。

而使用 join 方法來將一組 PyStringObject 進行連接時,則只需要分配一次內存。方法內部會首先計算連接這些字元串需要的存儲空間,然後一次性申請需要的內存,再將每個 PyStringObject 對象維護的字元串拷貝到新的地址中去。需要連接的字元串越多,join 方法的優勢也就越明顯。

附上 Python2.7 中 PyStringObject 對象的 join 方法的實現,有興趣的同學請自行閱讀:

static PyObject *
string_join(PyStringObject *self, PyObject *orig)
{
char *sep = PyString_AS_STRING(self);
const Py_ssize_t seplen = PyString_GET_SIZE(self);
PyObject *res = NULL;
char *p;
Py_ssize_t seqlen = 0;
size_t sz = 0;
Py_ssize_t i;
PyObject *seq, *item;

seq = PySequence_Fast(orig, "can only join an iterable");
if (seq == NULL) {
return NULL;
}

seqlen = PySequence_Size(seq);
if (seqlen == 0) {
Py_DECREF(seq);
return PyString_FromString("");
}
if (seqlen == 1) {
item = PySequence_Fast_GET_ITEM(seq, 0);
if (PyString_CheckExact(item) || PyUnicode_CheckExact(item)) {
Py_INCREF(item);
Py_DECREF(seq);
return item;
}
}

/* There are at least two things to join, or else we have a subclass
* of the builtin types in the sequence.
* Do a pre-pass to figure out the total amount of space well
* need (sz), see whether any argument is absurd, and defer to
* the Unicode join if appropriate.
*/
for (i = 0; i &< seqlen; i++) { const size_t old_sz = sz; item = PySequence_Fast_GET_ITEM(seq, i); if (!PyString_Check(item)){ #ifdef Py_USING_UNICODE if (PyUnicode_Check(item)) { /* Defer to Unicode join. * CAUTION: Theres no guarantee that the * original sequence can be iterated over * again, so we must pass seq here. */ PyObject *result; result = PyUnicode_Join((PyObject *)self, seq); Py_DECREF(seq); return result; } #endif PyErr_Format(PyExc_TypeError, "sequence item %zd: expected string," " %.80s found", i, Py_TYPE(item)-&>tp_name);
Py_DECREF(seq);
return NULL;
}
sz += PyString_GET_SIZE(item);
if (i != 0)
sz += seplen;
if (sz &< old_sz || sz &> PY_SSIZE_T_MAX) {
PyErr_SetString(PyExc_OverflowError,
"join() result is too long for a Python string");
Py_DECREF(seq);
return NULL;
}
}

/* Allocate result space. */
res = PyString_FromStringAndSize((char*)NULL, sz);
if (res == NULL) {
Py_DECREF(seq);
return NULL;
}

/* Catenate everything. */
p = PyString_AS_STRING(res);
for (i = 0; i &< seqlen; ++i) { size_t n; item = PySequence_Fast_GET_ITEM(seq, i); n = PyString_GET_SIZE(item); Py_MEMCPY(p, PyString_AS_STRING(item), n); p += n; if (i &< seqlen - 1) { Py_MEMCPY(p, sep, seplen); p += seplen; } } Py_DECREF(seq); return res; }


很基礎的東西,為啥不會?

說明沒有認真看書。


s = abcd
new_s =
for c in s:
new_s += str(ord(c) - 96)
print(new_s)

問主應該是個初學者,用個最容易理解的過程式寫法你看看。


再次感謝@黃哥

為了和我一樣的初學者,把我最後成形的py腳本放上來。

其中99%來自黃哥的腳本,其實裡面的命令我基本不認識,還沒看到那裡呢:)

不過不影響用,根據我的需求做了兩個個小調整:

1.增加輸入命令,這樣每次計算不用在命令行改了;

2.增加序號位數(目前是10位)

s = raw_input("Enter the word: ")

numebr_str = "".join(

[str((lambda x: ord(x) - ord(a) + 1)(char)) for char in s])

print(numebr_str[:10])

最終的效果

字母分開的時候出現了一條橫線,那個應該就是空格,恰好取到它了吧。


推薦閱讀:

python 括弧檢測是否匹配?
如何理解Python裝飾器?
用Python做地圖投影 - 多面孔的世界
Python到底是個啥?
【Python基礎教程】閱讀&amp;實驗報告〖一〗

TAG:Python |