2014-12-10 6 views
2

Есть ли простой способ задать набор для элемента в Python? Вот некоторые методы, которые я использовал:Запрос элемента из набора Python

elem = myset.pop(); myset.add(elem) 
elem = random.choice(list(myset)) 
elem = list(myset)[0] 

Каждый из этих методов неэффективен и неуклюж.

Есть ли способ просто спросить что-то вроде elem = myset.get(), которое возвращает элемент набора без его удаления? Точно так же, как без удаления pop()?

(Конечно, метод, скорее всего, вернется тот же элемент, каждый раз, до тех пор, пока не установятся был изменен другим кодом, но это все равно полезно.)

+0

Ответы, предоставленные до сих пор, используют итераторы, но я бы не сказал, что это проблема с читабельностью, о которой вы говорили в ответе user2357112s. Итераторы - это то, к чему должны стремиться даже неопытные программисты. Не следует опускать полезные функции языка только потому, что кто-то из C не знает их –

+0

@Lord Я согласен в принципе. Большинство программистов увидят эти строки и подумают, что «это немного странно». Первый создает итератор, извлекает одно значение и затем уничтожает его. Второй запускает цикл через набор и немедленно выходит без выполнения каких-либо утверждений. Оба они эффективны, но если не прокомментировать, многие программисты будут обдумывать (хотя бы кратко), как это сделать лучше. – CarpetPython

ответ

2
elem = next(iter(myset)) 

или

for elem in myset: 
    break 

Если вы обнаружите, что эти фрагменты кода путают людей, вы можете обернуть их функцией с хорошим именем:

def arbitrary_element_of(thing): 
    for elem in thing: 
     return elem 
    raise ValueError("Argument is empty") 
+0

Оба являются шагом вперед в эффективности +1. Однако есть проблема с читабельностью. Мне нужно будет прокомментировать эту строку кода каждый раз, когда я использовал один из них. Программисты Python без особого опыта задаются вопросом, что он делает. – CarpetPython

+0

@CarpetPython: Рассмотрите возможность их обертки в функции. – user2357112

1
>>> myset = (1,2,3,4,10) 
>>> gen = (iter(myset)) 
>>> next(gen) 
1 
>>> next(gen) 
2 
>>> next(gen) 
3 
>>> next(gen) 
4 
>>> next(gen) 
10 
>>> next(gen) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration 
0

Вы можете использовать такую ​​функцию, которая разрушительно и произвольно выполняет итерацию по содержимому временного словаря, созданного из элементов набора.

def get_elem(s): 
    d = dict.fromkeys(s) 
    while d: 
     yield d.popitem()[0] 
Смежные вопросы