Предпочитаемый способ Python получить элемент набора с длиной (/ кардинальность) один, не удаляя его?

1

При заданном наборе s, какой из сегментов ниже выглядит лучше?

if len(s) == 1:
    v = s.copy().pop()
    # important stuff using variable v takes place here

или

if len(s) == 1:
    v = s.pop()
    s.add(v)
    # important stuff using variable v takes place here

или

if len(s) == 1:
    for v in s:
        # important stuff using variable v takes place here

Я думаю, что последний сегмент является наиболее эффективным, но разве не глупо использовать цикл, который никогда не выполняется на самом деле?

Почему у наборов python нет альтернативного метода pop, который не удаляет элемент?

Это может показаться тривиальным вопросом, но поскольку я столкнулся с этим сценарием несколько раз, он стал зудом, нуждающимся в царапине!

Теги:
set
member
cardinality

2 ответа

3
Лучший ответ

Вы можете назначить единственный элемент v следующим образом:

(v,) = the_set

Это вызывает исключение, если the_set не содержит ровно одного элемента.

  • 0
    @Will: он выполняет итерацию по правой стороне напрямую, так же как и v = next(iter(s)) detly.
  • 0
    Также возможно без скобок: v, = the_set .
5

Почему у наборов python нет альтернативного метода pop, который не удаляет элемент?

Если вы хотите получить доступ к первому (и единственному) элементу без изменения структуры набора, используйте итератор:

v = iter(s).next()

Это работает до Python 3. В Python 3 вам необходимо использовать встроенную функцию next:

v = next(iter(s))
  • 1
    Вы не можете сделать some_set[0] потому что наборы не имеют порядка.
  • 1
    Как вы -1 человек, который дал +1 :)
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню