고효율python 코드 지속적 축적

9869 단어
때때로 빠른 데이터 실현 구조를 잊어버리기 쉽고 이때부터 기록을 한다.
1. 2D 배열의 첫 번째 요소를 기준으로 다음과 같이 정렬합니다.
data = [[2,3],[5,4],[9,6],[4,7],[8,1]]
data.sort(key=lambda x:x[0])
print(data)
[[2, 3], [4, 7], [5, 4], [8, 1], [9, 6]]

 2.빠른 무게 제거
def dedupe(items, key=None):
 """
 items:  
 key:  items (dict ) 
 """
 seen = set()
 for item in items:
     val = item if key is None else key(item)
     if val not in seen:
         yield item
         seen.add(val)

nums = [1,2,32,2,2,4,3,2,3,42]
print(list(dedupe(nums)))
# [1, 2, 32, 4, 3, 42]

students = [
 {"name": "Stanley", "score": 88},
 {"name": "Lily", "score": 92},
 {"name": "Bob", "score": 91},
 {"name": "Well", "score": 80},
 {"name": "Bob", "score": 90},
 {"name": "Peter", "score": 80}
]
deduped_students = list(dedupe(students, key=lambda s: s['name']))
print(deduped_students)
"""
[{'name': 'Stanley', 'score': 88},
{'name': 'Lily', 'score': 92},
{'name': 'Bob', 'score': 91},
{'name': 'Well', 'score': 80},
{'name': 'Peter', 'score': 80}]   #  
"""
#  
deduped_students = list(dedupe(students, key=lambda s: (s['name'], s['score'])))

 3.jaccar 싱크로율: 두 문장이 단어를 나눈 후 단어의 교집합과 단어의 병집합의 비례
def sim_jaccard(s1, s2):
    """jaccard """
    s1, s2 = set(s1), set(s2)
    ret1 = s1.intersection(s2)  #  
    ret2 = s1.union(s2)  #  
    sim = 1.0 * len(ret1) / len(ret2)
    return sim

4. 거리 유사도 편집: 한 문장을 다른 문장으로 전환하는 데 필요한 편집 횟수, 편집은 삭제, 추가, 교체를 포함하고 가장 긴 문장의 길이를 귀일화하여 유사도를 얻는다.
def sim_edit(s1, s2):
    """ """
    def edit_distance(str1, str2):
        len1, len2 = len(str1), len(str2)
        dp = np.zeros(((len1 + 1, len2 + 1)))
        for i in range(len1 + 1):
            dp[i][0] = i
        for j in range(len2 + 1):
            dp[0][j] = j
        for i in range(1, len1 + 1):
            for j in range(1, len2 + 1):
                temp = 0 if str1[i - 1] == str2[j - 1] else 1
                dp[i][j] = min(dp[i - 1][j - 1] + temp, min(dp[i - 1][j] + 1, dp[i][j - 1] + 1))
        return dp[len1][len2]
    # 1.  
    res = edit_distance(s1, s2)  
    # 2.  0~1
    maxLen = max(len(s1), len(s2))  
    sim = 1 - res * 1.0 / maxLen
    return sim

5.simHash 싱크로율: 먼저 두 문장의simhash 2진법 인코딩을 계산하고 해명거리를 사용하여 계산하며 마지막으로 두 문장의 최대simhash값을 사용하여 싱크로율을 귀일화한다.
한명 거리라고도 하는 해밍 디스턴스는 정보론에서 두 등장 문자열 사이의 한명 거리는 두 문자열이 대응하는 위치의 서로 다른 문자의 개수이다.즉, 하나의 문자열을 다른 문자열로 바꾸는 데 필요한 문자 개수이다.예를 들어 101101과 1001001 사이의 한명 거리는 2이다.우리가 흔히 말하는 문자열 편집 거리는 일반적인 형식의 한명 거리이다.
from simhash import Simhash
def sim_simhash(s1, s2):
    a_simhash = Simhash(s1, f=64)
    b_simhash = Simhash(s2, f=64)

    # hash 
    tmp1 = bin(a_simhash.value)
    tmp2 = bin(b_simhash.value)
    max_hashbit = max(len(tmp1), len(tmp2))

    #  
    distance = a_simhash.distance(b_simhash)
    sim = 1- distance * 1.0 / max_hashbit

    print(sim)

좋은 웹페이지 즐겨찾기