LINUX.ORG.RU

python: как генерировать уникальные ID для элементов списка

 ,


1

1

Есть ли в стандартной библиотеке питона механизм генерации уникальных ID для последовательностей такого вида:

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

Нужно присваивать IDs каждому элементу, например A=0, B=1 и т.д. В данный момент я это делаю следующими функциями:

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]

Я новичок в питоне, но этот код работает. Но - я подозреваю, что python имеет эффективные механизмы достичь этого более компактным способом? Наверняка есть что-то в библиотеке collections?

★★

Честно говоря, совершенно неясно, чего конкретно ты пытаешься добиться. Какой тип данных у твоих последовательностей? Нужно ли присваивать ID последовательностям или их элементам? Для чего тебе, в конце концов, эти ID?

beresk_let ★★★★★
()

Присоединяюсь к вопросу, что непонятно что в итоге надо. Но код - говно.

Если нужна уникальность для последовательностей и они такие простые «A-B-C-D», то хеш считай.

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 1)

Походу ему нужно внутри последовательности строк с возможными повторениями (A, A, E, D) каждой уникальной строке присвоить уникальный ID.

Ну первым делом напрашивается вопрос чем вам в таком случае сами строки не ID?

А так я бы реализовал это как-то так:

import collections, itertools
  
counter = itertools.count()
ids = collections.defaultdict(lambda: next(counter))

print(ids['A'])
print(ids['A'])
print(ids['E'])
print(ids['D'])
print(ids['A'])
print(ids['D'])

Вывод:

0
0
1
2
0
2
slovazap ★★★★★
()

Почти что уверен на 146%, что пистон умеет в UUID. То тебе скоррее всего и надо.

beastie ★★★★★
()
Ответ на: комментарий от slovazap

Походу ему нужно внутри последовательности строк с возможными повторениями (A, A, E, D) каждой уникальной строке присвоить уникальный ID.

Нет. Нужно каждому элементу строки присвоить ID. Например, в строке A-B-C-D-A-E-D каждый элемент получит следующие ID:

A-0 B-1 C-2 D-3 E-4

ids = collections.defaultdict(lambda: next(counter))

Спасибо,посмотрю на next().

Ну первым делом напрашивается вопрос чем вам в таком случае сами строки не ID?

Потому что меня интересует обработка элементов строки, а не самой строки.

cruz7 ★★
() автор топика
Последнее исправление: cruz7 (всего исправлений: 1)
Ответ на: комментарий от cruz7

Нет. Нужно каждому элементу строки присвоить ID

Именно это я и написал.

Спасибо,посмотрю на next().

Посмотри та всё. К слову, этот код семантически эквивалентен твоему, просто для увеличивающиегося счётчика и словаря создающего значения элементов уже есть готовые примитивы и их не нужно писать самому. Ещё у тебя ошибка в genid - там должно быть global ids.

Потому что меня интересует обработка элементов строки, а не самой строки

Это одно и то же. Если так понятнее, то в чём проблема использовать элементы строки как ID?

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 2)

Зависит от целей использования этого айдишника.

  1. В общем случае ты хочешь GUID/UUID.
  2. Многие объекты питона поддерживают функцию hash(), которая возвращает (относительно) уникальное значение для объекта.
  3. Если тебе не нужна персистентность и набор строк не меняется в процессе, в питоне есть метод встроенный id() для каждого объекта, который возвращает уникальный хэндл в пределах процесса.
  4. А тебе точно нужно явно знать айди? Не хватит ли тебе для твоих целей обыкновенного dict/set, которые обеспечивают уникальность элементов?
E ★★★
()
Ответ на: комментарий от slovazap

чем A E D не id, вот в чем вопрос? (:

anonymous
()
Ответ на: комментарий от E

А тебе точно нужно явно знать айди? Не хватит ли тебе для твоих целей обыкновенного dict/set, которые обеспечивают уникальность элементов?

Дело в том что IDs мне нужны для того, чтобы использовать их в качестве координат в матрице.

cruz7 ★★
() автор топика
Ответ на: комментарий от cruz7

Дело в том что IDs мне нужны для того, чтобы использовать их в качестве координат в матрице.

Надо было начинать с того, что тебе обязательны последовательные целые числа. Тогда решение от slovazap - это именно то, что тебе нужно.

E ★★★
()
Последнее исправление: E (всего исправлений: 1)

уникальные ID

GUID и хеш-функции

Какие же все наивные.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.