字元串pythonhash
㈠ 如何用python構造hash表解決DNA k-mer問題
思路:
1、首先採用命A=0,C=1,G=2,T=3. 就相當於4進制數字,然後採用karp-Rabin演算法轉換成唯一十進制數字。由於用此演算法的哈希函數為:hash(value)=value*(4^(k-q-1));
value是該字元對應的值,k是kmer長度,q是此字元在字元串的位置范圍在[0-(q-1)]。然後把一個kmer裡面所有字元的hash值求和就行了。
2、那麼很容易看出來,對於連續的下害常憤端蒞得縫全俯戶一個Kmer,就有推理公式了 hashNew=addValue+(hashOld-deleteValue*(4^(k-1)))*4; hashNew就是往右平移一個字元的kmer hash值,hashOld就是平移之前的值,addValue就是平移後右邊多的一個字元,deleteValue就是平移後左邊少的一個字元。這樣整個hash表建立的時間復雜度約為O(m+k),m是整個文本長度。
3、由於kmer長度如果過長,其hash值過大,會造成內存不夠溢出的現象,所以kmer內部定死為10 。那麼問題就來了,如何應對不同的kmer值。分三種情況。
第一種:q>10
這種可以將kmer以10為單位,將hash表中對應值取出,然後對結果進行分析,這邊分析方法為建立兩個數組一個二維數組unionName儲存位置關系,一個一維數組unionScore,計數用。 思路就是首先第一輪初始化unionName[Name][Pos]全部賦值Pos 並初始化unionScore,然後再第二輪匹配如果unionName[Name][Pos-cycle]=Pos-1則將其賦值為當前Pos,cycle為當前循環次數。並將當前循環數存入unionScore[NAME]中。最後當unionScore[NAME]值也就是循環數為k-1,即我們需要的交集了。
第二種:q=10
直接求出hash值,取出相應的值即可。
第三種:q<10
可以用前綴種子+後綴種子交集產生。
前綴種子:在字元串後面補字元直到長度等於K,這個很容易看出來 最小是全補A,最大是全補T,然後將最小值到最大值之間的hash值即為所求。
後綴種子:後綴種子和前綴種子不同就是在字元串左邊補齊字元。所以此時需要進行變換。只要對前置種子產生的值變化下就行了。(preValue-minValue)*(4^(K-q))+hash(p) 。其中preValue就是對應的前置種子的hash值,minValue就是前置種子中最小值也就是全補A的情況,hash(p)就是字元串長度為p時候的hash值。
交集就是先求後綴種子所有的值,再加上 前綴種子中起始位置在[0-(k-1)]中的值。
㈡ Python中怎麼把list轉換為字元串
例子:
將列表temp_list = ['h', 'e', 'l', 'l', 'o'] 轉換成字元串'hello',代碼如下:
temp_list = ['h', 'e', 'l', 'l', 'o'];result = ''.join(temp_list)print(result) # hello
字元串對象的方法join其描述如下:s.join(iterable)是將括弧內的迭代對象(如列表)使用s字元串作為鏈接將迭代對象中的元素拼接成一個字元串,返回該字元串。
(2)字元串pythonhash擴展閱讀:
Python的控制語句:
1、if語句,當條件成立時運行語句塊。經常與else, elif(相當於else if) 配合使用。
2、for語句,遍歷列表、字元串、字典、集合等迭代器,依次處理迭代器中的每個元素。
3、while語句,當條件為真時,循環運行語句塊。
4、try語句,與except,finally配合使用處理在程序運行中出現的異常情況。
5、class語句,用於定義類型。
6、def語句,用於定義函數和類型的方法。
7、pass語句,表示此行為空,不運行任何操作。
㈢ python如何統計字元串
判斷特定詞出現很容易,統計出現次數也很容易。但是處於多個特定詞之後的每一個非特定詞歸哪個特定詞?還有,後出現的關鍵詞不需要作為先出現的關鍵詞的子項吧?
我覺得用hash表比較方便表示。另外,關鍵詞放到一個列表裡。['cnn.com','amazon.com',...]
然後構建一個hash表Map 【鍵就是關鍵詞,值是一個hash表,每項是 詞:計數的形式 】
{ {'cnn.com': { 'a.com':1 },... },'amazon.com':{ 'bb.com':1,...},... }
這個表是處理過程中逐步建立起來的
然後每次遇到一次詞X,比較是否在關鍵詞列表中,如果是 並且hash表中沒有,加到hash表中,Map[X]={},否則不添加;
如果不是關鍵詞,那麼在Map表中每個項記上一筆【當然,如果不在一個關鍵詞的值hash表中噢,新增一項,否則增加計數】。
最後,遍歷關鍵詞hash表,並對值按照逆序輸出。就是你要求的格式。
㈣ 如何使用Python 3的兩個庫來加解密字元串
哈希
如果需要用到安全哈希演算法或是消息摘要演算法,那麼你可以使用標准庫中的 hashlib 模塊。這個模塊包含了符合 FIPS(美國聯邦信息處理標准)的安全哈希演算法,包括 SHA1,SHA224,SHA256,SHA384,SHA512 以及 RSA 的 MD5 演算法。Python 也支持 adler32 以及 crc32 哈希函數,不過它們在 zlib 模塊中。
哈希的一個最常見的用法是,存儲密碼的哈希值而非密碼本身。當然了,使用的哈希函數需要穩健一點,否則容易被破解。另一個常見的用法是,計算一個文件的哈希值,然後將這個文件和它的哈希值分別發送。接收到文件的人可以計算文件的哈希值,檢驗是否與接受到的哈希值相符。如果兩者相符,就說明文件在傳送的過程中未經篡改。
讓我們試著創建一個 md5 哈希:
>>> import hashlib >>> md5 = hashlib.md5() >>> md5.update('Python rocks!') Traceback (most recent call last): File "<pyshell#5>", line 1, in <mole> md5.update('Python rocks!') TypeError: Unicode-objects must be encoded before hashing >>> md5.update(b'Python rocks!') >>> md5.digest() b'\x14\x82\xec\x1b#d\xf6N}\x16*+[\x16\xf4w'
讓我們花點時間一行一行來講解。首先,我們導入 hashlib ,然後創建一個 md5 哈希對象的實例。接著,我們向這個實例中添加一個字元串後,卻得到了報錯信息。原來,計算 md5 哈希時,需要使用位元組形式的字元串而非普通字元串。正確添加字元串後,我們調用它的 digest 函數來得到哈希值。如果你想要十六進制的哈希值,也可以用以下方法:
>>> md5.hexdigest() ''
實際上,有一種精簡的方法來創建哈希,下面我們看一下用這種方法創建一個 sha1 哈希:
>>> sha = hashlib.sha1(b'Hello Python').hexdigest() >>> sha ''
可以看到,我們可以同時創建一個哈希實例並且調用其 digest 函數。然後,我們列印出這個哈希值看一下。這里我使用 sha1 哈希函數作為例子,但它不是特別安全,讀者可以隨意嘗試其他的哈希函數。
密鑰導出
Python 的標准庫對密鑰導出支持較弱。實際上,hashlib 函數庫提供的唯一方法就是 pbkdf2_hmac 函數。它是 PKCS#5 的基於口令的第二個密鑰導出函數,並使用 HMAC 作為偽隨機函數。因為它支持「加鹽(salt)」和迭代操作,你可以使用類似的方法來哈希你的密碼。例如,如果你打算使用 SHA-256 加密方法,你將需要至少 16 個位元組的「鹽」,以及最少 100000 次的迭代操作。
簡單來說,「鹽」就是隨機的數據,被用來加入到哈希的過程中,以加大破解的難度。這基本可以保護你的密碼免受字典和彩虹表(rainbow table)的攻擊。
讓我們看一個簡單的例子:
>>> import binascii >>> dk = hashlib.pbkdf2_hmac(hash_name='sha256', password=b'bad_password34', salt=b'bad_salt', iterations=100000) >>> binascii.hexlify(dk) b''
這里,我們用 SHA256 對一個密碼進行哈希,使用了一個糟糕的鹽,但經過了 100000 次迭代操作。當然,SHA 實際上並不被推薦用來創建密碼的密鑰。你應該使用類似 scrypt 的演算法來替代。另一個不錯的選擇是使用一個叫 bcrypt 的第三方庫,它是被專門設計出來哈希密碼的。
㈤ Python中的數字類型和字元串類型為什麼設計為不可變更類型這么做是處於什麼樣的目的
官方解釋:
One is performance: knowing that a string is immutable means we can allocate space for it at creation time, and the storage requirements are fixed and unchanging. This is also one of the reasons for the distinction between tuples and lists.
Another advantage is that strings in Python are considered as 「elemental」 as numbers. No amount of activity will change the value 8 to anything else, and in Python, no amount of activity will change the string 「eight」 to anything else.
大意就是性能好,在創建時就分配固定大小的內存,另外就是字元串、數字為基本類型,相對其他數據類型,改變的情況要少
㈥ python怎麼把列表轉換成字元串
在python中將列表轉換為字元串的方法如下:
1、通過桌面快捷方式或搜索來打開Python IDLE程序。
㈦ python 傳字元串給dll的問題
用ctypes,
>>> from ctypes import *
>>> libc=cdll.msvcrt
>>> libc.printf("hello %s\n","world")
hello world
12
>>>
>>> p = create_string_buffer("Hello", 30)
>>> n=libc.sprintf(p,"hello %s\n","world")
>>> n
12
>>> print p
<ctypes.c_char_Array_30 object at 0x02247C10>
>>> dir(p)
['__class__', '__ctypes_from_outparam__', '__delattr__', '__delitem__', '__delsl
ice__', '__dict__', '__doc__', '__format__', '__getattribute__', '__getitem__',
'__getslice__', '__hash__', '__init__', '__len__', '__mole__', '__new__', '__r
ece__', '__rece_ex__', '__repr__', '__setattr__', '__setitem__', '__setslice
__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__',
'_b_base_', '_b_needsfree_', '_length_', '_objects', '_type_', 'raw', 'value']
>>> p.value
'hello world\n'
>>>
㈧ Python的版本字元串的比較問題,怎麼解決
3開始沒這個函數了,官方文檔是這么寫的 The cmp() function should be treated as gone, and the __cmp__() special method is no longer supported. Use __lt__() for sorting, __eq__() with __hash__(), and other rich comparisons as needed. (If you really need the cmp() functionality, you could use the expression (a > b) - (a < b) as the equivalent for cmp(a, b).) 大意就是cmp()函數已經「離開」了,如果你真的需要cmp()函數,你可以用表達式(a > b) - (a < b)代替cmp(a,b)
㈨ python中string的hash函數為什麼選擇這個
字元串hash演算法有很多,為什麼用這個不用其他呢,也許只是隨便挑了一個性能過得去的。 如果解決了您的問題請採納! 如果未解決請繼續追問
㈩ Python如何哈希字元串
Python中字元串是可哈希的,即可以作為字典的鍵或者HashTable的鍵使用。
您可以這樣子使用Python內置函數hash(散列函數):
總之,Python裡面有很多內置的hash功能性數據結構和函數。