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基礎教程】閱讀&實驗報告〖一〗
TAG:Python |