Поддерживает ли стандартная библиотека создание уникальных идентификаторов? - PullRequest
0 голосов
/ 11 декабря 2019

Предполагая, что у меня есть следующие последовательности:

A-B-C-D
A-C-C-E
B-B-B-D
A-A-E-D
...

Мне нужно назначить уникальные числовые идентификаторы для каждого элемента, например, A = 0, B = 1 и т. Д., И работать с этими идентификаторами. На данный момент я генерирую ID со следующей функцией:

    id = -1
    ids = dict()

    def getid():
        global id
        id += 1
        return id

    def genid(s):
        global id
        if not s in ids:
            ids[s] = getid()

        return ids[s]

Я новичок, поэтому это может быть не идеальное решение, но оно работает. Однако я волнуюсь, что это будет очень медленно / неэффективно для большого количества .последовательностей и элементов (представьте вместо A, B и т. Д. В нем есть комбинация букв ABCD, XYZ и так далее). Я считаю, что у Python есть механизмы для достижения этой цели более компактным способом. Может быть, в библиотеке collections есть что-то, что может сделать это в 1-2 строки?

1 Ответ

0 голосов
/ 11 декабря 2019

Вы можете избежать global в целом, и как предложено использовать count:

from itertools import count

id_counter = count()
ids = dict()

def getid():
    return next(id_counter)

def genid(s):
    if s not in ids:
        ids[s] = getid()
    return ids[s]

Вы можете использовать "магию питона", чтобы сделатькороче:

from itertools import count

def genid(s, id_counter=count(), ids={}):
    if s not in ids:
        ids[s] = next(id_counter)
    return ids[s]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...